1

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

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

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

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

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

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

4

2 回答 2

1

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

每次你有一个动态加载的脚本时,增加一个计数器。还包括一些减少该计数器的东西......

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

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

if (counter > 0) return;

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

它很杂乱,但它会解决你的问题。

于 2012-09-06T14:55:08.057 回答
0

您还没有真正描述需要异步加载这些库的原因。第三方库通常具有“脚本加载”功能,您可以在加载脚本之前定义这些功能。如果您需要在执行代码之前加载多个库,您可能必须 1. 每次加载库时启动一些代码以测试是否加载了所有所需的库,然后启动您的代码 2. 对于每个库,创建一个 jQuery Promise/deferred 以在加载该库时得到解决,并使用$.when(Promise).done(函数/代码)在加载特定集合时测试和运行代码,或者 3. 重写以使用 RequireJS。如果这些库是您的代码,那么您可能必须将启动代码添加到您的库中;这可能是学习 RequireJS 的好时机。

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

编辑:

当然,这并不是说 jQuery 有唯一的 Promise 库,我只是经常建议在这类事情上使用某种形式的 Promise。

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

于 2012-09-06T14:57:33.597 回答