在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

本文关键字:脚本 警告 超时 模式 ready-event DOM 加载 片段      更新时间:2023-09-26

我正在用大量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()按顺序单独执行它们。