在DOM ready-event上加载大量脚本片段的模式,而不会弹出脚本超时警告
Pattern for loading a lot of script snippets on DOM ready-event, without IE 8 popping up a script time-out warning
我正在用大量JavaScript编写一个界面——所有小的、自包含的代码片段,用来在界面上做各种事情。
所有的代码片段(或者功能块,如果你愿意的话)都放在同一个作用域中;DOM就绪事件。这是为了让不同的代码片段能够共享几个作用域的全局变量。
它的结构是这样的…
$(function ()
{
var SCOPED_GLOBAL_1;
var SCOPED_GLOBAL_2;
// Etc.
// A snippet of code designed to enable X functionality
// Another snippet of code designed to enable Y functionality
// Etc.
});
使用这种方法,我得到了可怕的脚本超时弹出,因为要执行大量代码。
Internet Explorer 8根据调用的次数确定脚本超时…很多人都打了电话…很多!
我已经做了一些测试,据我所知,避免弹出窗口的唯一方法是使用setTimeout,并逐步执行代码块。
我已经尝试将代码拆分为多个调用DOM就绪事件,但似乎Internet Explorer 8将这些调用解释为好像它们是一个调用。(分析时签名相同)。
如果我需要实现setTimeout方法,代码将变得混乱。而共享作用域的全局变量并不容易。
你们有办法帮我吗?
正如你们中的一些人所建议的那样,优化代码将是处理这个问题的一种方法。我确信代码中有优化的空间,但在我看来;这里的问题仅仅是代码的数量,而不是它的执行方式。
有很多正在运行的预设置代码,它们初始化各种UI组件。正是这段代码导致了ie8的问题…是由呼叫的数量决定的。不是代码执行所需的时间。
代码在所有其他浏览器中运行得又快又好,平均加载时间为1.5秒(与正在进行的内容相比,这是很快的)。这里的问题是,ie8将脚本定义为缓慢的,通过调用的数量,而所有其他浏览器(和ie9,似乎)定义超时的时间,它需要代码执行。
除了重构之外,setTimeout
可能是本书中最简单的技巧。也不必太乱:
$(function () {
var SCOPED_GLOBAL_1, SCOPED_GLOBAL_2;
// Add code in blocks
var codeBlocks = [];
codeBlocks.push(function () {
// A snippet of code
});
codeBlocks.push(function () {
// Another snippet of code
});
// Execute code in blocks
while (codeBlocks.length) {
(function (func) {
setTimeout(func, 0);
})(codeBlocks.shift());
}
});
这实际上是创建一个包含任意数量代码块的队列,并使用setTimeout()
按顺序单独执行它们。
相关文章:
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 借助asp.net验证或java脚本对多个文本进行验证
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- Java脚本时间添加
- chrome扩展更改主机/域警告
- 浏览器开发工具:禁用第三方脚本中的警告
- 在IE中导致“脚本运行缓慢”警告
- AJAX调用中缺少POST参数会导致PHP脚本中出现未定义的索引警告
- Java脚本警告框,而文本框为只读
- 谷歌应用程序脚本警告
- 警告脚本:无法设置属性'action'的定义
- 加载脚本时发出警告
- 如何完全禁用所有退出警告/确认消息与用户脚本
- 警告:从异步加载的外部脚本调用document.write()被忽略.这是如何解决的
- 重定向页面上的Java脚本函数警告框(OK)单击
- 警告:资源被解释为脚本,但以MIME类型text/plain传输
- PHP脚本中没有显示Java警告弹出
- 我在客户端和服务器端都实现了xdomain脚本,但在IE9中不断获得'超时等待iframe套接字'警告
- 在DOM ready-event上加载大量脚本片段的模式,而不会弹出脚本超时警告
- 注入的脚本在Firefox 4中没有显示警告