Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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
欺骗Internet Explorer Javascript引擎让脚本运行_Javascript_Internet Explorer - Fatal编程技术网

欺骗Internet Explorer Javascript引擎让脚本运行

欺骗Internet Explorer Javascript引擎让脚本运行,javascript,internet-explorer,Javascript,Internet Explorer,我反复遇到Internet Explorer的“此脚本运行时间太长,是否要继续?”消息的问题。我想知道是否有人知道一个聪明的方法来欺骗JS引擎保持安静?根据我所做的一些搜索,我发现引擎监视它认为可能无限循环的状态,因此我想也许我可以添加一些逻辑,每隔一段时间改变执行,以愚弄它,使其不受影响,但没有运气。我还尝试将一个较长的循环分解为几个较短的循环,但这没有起到任何作用。具体来说,当前导致问题的代码是树结构中节点的扩展。代码在当前节点上循环并扩展每个节点。用Javascript编写是一件小事,但我

我反复遇到Internet Explorer的“此脚本运行时间太长,是否要继续?”消息的问题。我想知道是否有人知道一个聪明的方法来欺骗JS引擎保持安静?根据我所做的一些搜索,我发现引擎监视它认为可能无限循环的状态,因此我想也许我可以添加一些逻辑,每隔一段时间改变执行,以愚弄它,使其不受影响,但没有运气。我还尝试将一个较长的循环分解为几个较短的循环,但这没有起到任何作用。具体来说,当前导致问题的代码是树结构中节点的扩展。代码在当前节点上循环并扩展每个节点。用Javascript编写是一件小事,但我不能允许这些超时错误,所以我认为我唯一的选择可能是通过AJAX请求预扩展的视图数据。我目前正在一个开发环境中使用一个小的(ish)数据集,我知道这不会在其他环境中运行。有人成功地抑制了这些警告吗?

您是否尝试过让它每隔一段时间输出一些内容?它可能只是检查输出,如果在x秒内没有输出,它会假设您处于无限循环中


如果输出有效,您可以尝试添加然后立即删除一些非常小的内容(如空的
)。

如何使用一系列事件将其隔开。所以循环发生发送事件,监听器发送事件触发器并执行循环。等等?

使用设置超时
一个好方法是使用函数调用模拟线程执行。这需要将整个处理过程拆分为更小的部分,并将它们一个接一个地排队。超时可以设置得非常接近,但当每个超时都完成执行时,它们将逐个运行。

为什么不将函数分解为一系列步骤,并使用jQuery将它们排队


此问题的一个常见解决方案是使用setTimeout函数。 这样做的方式是,将流程分成更小的部分,然后使用setTimeout函数一个接一个地执行这些部分。 我想这应该对你有帮助。 HTML5网络工作者还引入了另一个选项。 这个新标准应该允许您在单独的线程中执行长时间运行的任务,然后在回调中报告任何结果。 你可以在robertnyman.com/2010/03/25/using-html5-web-workers-to-have-background-computative-power这里阅读/
不幸的是,根据html5demos.com/

的说法,IE不支持超时,我认为超时更多的是基于语句的数量,而不是计时或启发式。通过为简单的事情优化代码,可以大大提高代码在触发警告之前可以处理的数量——特别是如果您在另一个库(如jQuery)上使用帮助器API。例如,更改此选项:

$.each(arr, function(value) {
   // do stuff
});
为此:

for (var i = 0, l = arr.length; i < l; i++) {
   var value = arr[i];
   // do stuff
}
for(变量i=0,l=arr.length;i
另一个简单的方法是缓存对字段的访问。如果您有两个“foo.bar”实例,请将结果存储在一个变量中,并在任何有意义的地方使用它


显然,我不知道你的代码是什么样子的,但我打赌你可以做很多改进,因为当你谈论这个超时问题时,这些小事情真的累加起来了。

我通过使用原型函数#defer方法实现了这一点,这与使用setTimeout方法基本相同。谢谢大家

+1我喜欢这个问题,因为答案多种多样:)不,涉及超时。那么如何解释禁用它的“MaxScriptStatements”设置?默认为5000000条语句。我认为产量不够。我很确定你必须以某种方式放弃死刑。