window.onload没有调用函数

时间:2015-04-13 02:02:36

标签: javascript html requirejs

使用此index.html:

<!DOCTYPE html>
<html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <script data-main="main" src="require.js"></script>
    </head>
    <body>
        <p>This is the body</p>
        <canvas id="canvas1"></canvas>
    </body>
</html>

和这个main.js

console.log("main.js ran");

function render() {
    console.log("render ran");
}

window.onload = render;

我希望控制台输出显示:

main.js ran
render ran

“main.js ran”按预期显示,但“render ran”未记录。渲染函数永远不会被调用。为什么不呢?

2 个答案:

答案 0 :(得分:9)

RequireJS loads the data-main script asynchronously。因此,页面加载和main.js加载之间存在竞争条件。如果main.js首先完成加载,则会设置window.onload,您将看到“render ran”。如果页面首先完成加载,则不会。发生这两种结果中的哪一种通常是不确定的,但由于您给出的示例页面非常短,因此通常在从服务器获取main.js之前完成加载。

如果您希望在加载页面后运行模块,可以在domReady module上添加依赖项:

<script src="require.js"></script> <!-- note, no 'data-main' -->
<script>require( ['main'], function() {} );</script>

main.js:

define(['domReady!'], function() {
    // ...
});

答案 1 :(得分:0)

这可能是RequireJS的问题以及页面已经加载的事实。 RequireJS应该已经在等待加载所有文件,因此请使用以下代码。

示例:

console.log("main.js ran");

function render() {
    console.log("render ran");
}

render();

如果您正在尝试等待HTML元素加载使用jQuery:

//will run once the page DOM is ready
$(element).ready(function(){
   ...
});

//will run once the entire page is
//loaded including images and iframes
$(element).load(function(){
   ...
});