2

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

例子:

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);

谢谢

4

3 回答 3

4

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

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

  • 当缓存已经包含您的数据时,该事件会在分配发生之前onload触发,因此您的处理程序永远不会被调用window.onload

我建议使用该domReady插件,因为它旨在处理这两种情况。我自己从来没有使用过它,但是从我可以从文档中收集到的东西,比如:

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

应该管用。顺便说一句,感叹号不是错字。然后,您需要使您的onload处理程序成为您传递给的函数的主体require

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

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

于 2013-11-11T23:23:18.323 回答
1

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

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

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

  $(document).ready(function () {
  });
});
于 2013-11-11T23:22:23.067 回答
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 插件的更多详细信息

于 2013-11-11T23:25:31.533 回答