$(window).load在IE中使用异步js库激发太快

时间:2012-09-06 13:57:04

标签: javascript jquery internet-explorer asynchronous window-load

我有一些严重的问题,在IE中$(window).load异步获取一些js库并执行它们

当然可以在其他浏览器中使用

所以问题是,我正在做类似

的事情
 <script type="text/javascript">
 var scr1 = document.createElement('script'); 
 scr1.type = 'text/javascript'; 
 scr1.src = 'some_lib.js'; 
 $('BODY').prepend(scr1); 
</script>

就在</body>之前,并在它上面的html中使用$(window).load方法来操作some_lib.js中的一些插件,但这一切都发生在IE中很快,很可能因为异步lib包括,我收到一个错误,该方法不适用于该元素。

是否有可能修改$(window).load方法,所以我仍然可以以相同的方式为每个浏览器使用它?

2 个答案:

答案 0 :(得分:1)

window.load()调用中的任何代码都必须放在一个函数中(在本例中称为onLoad)。

每次有动态加载的脚本时,都会增加一个计数器。还包括减少反击的东西......

src1.onload = function() { counter--; onLoad(); }

然后在'onLoad'中有第一行......

if (counter > 0) return;

这意味着onLoad将在window.load和每个脚本加载后触发,但只会在全部加载后执行。

这很糟糕,但它会解决你的问题。

答案 1 :(得分:0)

您还没有真正描述过需要异步加载这些库的原因。第三方库通常具有“脚本加载”功能,您可以在加载脚本之前定义这些功能。如果您需要在执行代码之前加载多个库,则可能必须在每次加载库时激活一些代码以进行测试,以查看是否已加载所需的所有库,然后触发代码2。每个库,创建一个jQuery promise / deferred以在加载该库时解析并使用$.when( promises ).done( function / code {{1每当加载特定集合时测试并运行代码,或者3.重写以使用RequireJS。如果这些库是您的代码,那么您可能必须向您的库中添加启动代码;这可能是学习RequireJS的好时机。

我希望我能进一步推荐,但是学习RequireJS背后的基础知识一直都在我的待办事项清单上,但还没有完成;我只知道这里成功使用它的人。如果这看起来太麻烦了,我会考虑选项2的一些变体。如果你不知道jQuery会被使用什么......你可能会被选项1或3困住。

编辑:

当然,这并不是说jQuery有唯一的承诺库,我经常建议以某种形式使用promises来处理这类事情。

Archer的技术看起来很有趣,我只是不知道它有多可靠(它可能非常可靠,我只是希望看到证明/文档)。你也可以将它与选项2结合起来,如果你想简化某些事情的执行,同时让其他人异步处理,并且这些脚本onload方法确实按预期工作。