我有一些严重的问题,在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
方法,所以我仍然可以以相同的方式为每个浏览器使用它?
答案 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方法确实按预期工作。