window.onload没有在页面刷新上运行

时间:2013-11-11 22:42:26

标签: javascript requirejs

我刚开始使用RequireJs。只有一个问题。有人可以解释为什么在页面刷新时不运行require块内的代码。 只有在我清除缓存时才会运行。

示例:

require(['game','comm','misc','soundutil','sprite','gui','constants'],function(Game,COMM,MISC,SoundUtil,Sprite, Gui,CNT){

    window.onload = function () {
        var canvas = document.getElementById('gameCanvas'),
         game = document.getElementById('game'),
         g = null,su = null;

        canvas.width = document.body.clientWidth;
        canvas.height = document.body.clientHeight;
console.log('Gamestate at beginning',CNT.GameState._current);

感谢

3 个答案:

答案 0 :(得分:4)

在您的问题中,您的代码看起来并不完整,但我将假设以下内容。你所描述的看起来像一个竞争条件:

  • 当缓存不包含您的数据时,window.onload的分配在onload偶数被触发之前发生,因此您的处理程序被调用。

  • 当缓存已包含您的数据时,onload事件会在分配给window.onload之前触发,因此您的处理程序永远不会称为

我建议使用domReady plugin,因为它旨在处理这两种情况。我自己从未使用它,但是我可以从documentation中收集到它,例如:

require(['domReady!', 'game','comm','misc','soundutil','sprite','gui','constants'],...

应该有效。顺便说一句,感叹号不是拼写错误。然后,您需要将onload处理程序作为传递给require的函数的主体。

请注意document.onload遇到同样的问题。它更容易出现你遇到的问题,因为它经常在window.onload之前触发。

ETA:正如Shrike所说,你也可以使用等待的jQuery方法:$(document).ready(...)。我的经验法则是,如果我已经在使用jQuery(我实际上在所有当前项目中都这样做了),那么我会使用$(document).ready(...),否则我会使用domReady。已经详细研究了这两种方法之间的差异in this question

答案 1 :(得分:1)

这是因为您的代码执行窗口已加载。所以你订阅了一个永远不会发生的事件。我不确定你的意思是什么样的缓存,以及为什么窗口的负载会激活。

如果使用jQuery,可以轻松修复代码:

require(['game', 'comm', 'misc', 'soundutil', 'sprite', 'gui', 'constants'], function(Game, COMM, MISC,SoundUtil, Sprite, Gui,CNT){

  $(document).ready(function () {
  });
});

答案 2 :(得分:1)

当RequireJS完成准备依赖项并执行工厂函数时,onload可能已经发生,在这种情况下,您的自定义处理程序将不会执行,因为它已经很晚(“onload train”已经离开)。

RequireJS特定的替代方法是使用domready插件:

require(['a', 'b', 'domready'], function (A, B, domReady) {
  domReady(function () {
    var canvas = document.getElementById('gameCanvas'),
      game = document.getElementById('game'),
      g = null,
      su = null;

    canvas.width = document.body.clientWidth;
    canvas.height = document.body.clientHeight;
    console.log('Gamestate at beginning', CNT.GameState._current);
    // ...
  });
});

有关domready插件in the official documentation

的更多详细信息