Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于在DOM就绪事件上加载大量脚本片段的模式,而不需要IE 8弹出脚本超时警告_Javascript_Jquery_Timeout - Fatal编程技术网

Javascript 用于在DOM就绪事件上加载大量脚本片段的模式,而不需要IE 8弹出脚本超时警告

Javascript 用于在DOM就绪事件上加载大量脚本片段的模式,而不需要IE 8弹出脚本超时警告,javascript,jquery,timeout,Javascript,Jquery,Timeout,我正在开发一个包含大量JavaScript的界面,所有这些都是小的、自包含的代码片段,设计用于在界面上执行各种操作 所有代码段(或功能块,如果愿意)都放在同一范围内;DOM就绪事件。这样,不同的代码片段就能够共享几个作用域全局变量 下面是它的结构 $(function () { var SCOPED_GLOBAL_1; var SCOPED_GLOBAL_2; // Etc. // A snippet of code designed to enable X

我正在开发一个包含大量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组件。这是导致Internet Explorer 8出现问题的代码。。。就电话的数量而言。而不是代码执行所需的时间


代码在所有其他浏览器中都运行得又快又好,平均需要一秒半的时间来加载(与正在进行的工作相比,这是很快的)。这里的问题是,Internet Explorer 8根据调用的次数将脚本定义为缓慢,而所有其他浏览器(以及IE 9)则根据代码执行的时间定义超时。

除了重构之外,
设置超时
可能是本书中最简单的技巧。它也不一定是凌乱的:

$(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()

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()

按顺序单独执行这些代码块?你期望得到什么样的答案?通用重构模式?恐怕没有。使用<代码> SETTIMEOUT的方法可能是最后考虑的问题。在那之前,重构/优化你的代码。我不确定,但是用匿名函数包装你的代码与是否触发脚本超时没有多大关系。很可能您的代码不是很理想。考虑你的代码的分析(计时)并尝试优化慢的部分。好吧,现在忽略优化(尽管它仍然是一个很好的事情),你看这里有什么问题吗?你期望得到什么样的答案?通用重构模式?恐怕没有。使用<代码> SETTIMEOUT的方法可能是最后考虑的问题。在那之前,重构/优化你的代码。我不确定,但是用匿名函数包装你的代码与是否触发脚本超时没有多大关系。很可能您的代码不是很理想。考虑分析(定时)代码并尝试优化慢的部分。好吧,现在忽略优化(尽管它仍然是一个很好的事情),你看了吗?