我刚开始使用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);
感谢
答案 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
的更多详细信息