我有一个包含2000个数组的数组,每个数组在HTA中的javascript中都有2000个值(存储2000x2000图像)。我有这段代码来测试数组中有多少"blue"
个值(数组的名称是image
):
var bluePixels = 0;
for(i = 0; i < image.length; i++){
for(j = 0; j < image[i].length; j++){
if(image[i][j] == "blue"){bluePixels = bluePixels + 1}
}
}
alert(bluePixels);
问题是它显示的消息显示“停止执行此脚本?此页面上的脚本会降低Internet Explorer的速度。如果继续,则计算机可能无法应答。” (我不确定确切的单词,因为我的计算机是法语)然后,如果我点击“否”,它会alert(bluePixels)
喜欢它,但如果我按下“是”它就不会吨。如何阻止此消息? (我知道有一些解决方法,比如在开始时告诉用户按“否”但我想要一个真正的解决方案)
答案 0 :(得分:1)
好像你有答案here
从答案: “为可能正在查看页面的所有用户解决问题的唯一方法是打破循环使用计时器执行的迭代次数,或者重构代码,以便它不需要处理尽可能多的指令。” / p>
因此,对于每个如此大的迭代,可以使用超时来实现第一种方法。
答案 1 :(得分:1)
您需要将较小的代码段(例如线程或进程)拆分为2000x2000 for-loop,这样浏览器的最大执行时间就不会耗尽。这里,图像数组一次解析一行,由计时器控制:
var bluePixels = 0,
timer,
i = 0;
function countBluePixels() {
for (var j = 0; j < image[i].length; j++){
if (image[i][j] == "blue") {
bluePixels = bluePixels + 1;
}
}
i=i+1;
if (i>image.length) {
clearInterval(timer);
alert(bluePixels);
}
}
timer = window.setInterval(countBluePixels, 0);
代码是相同的,只是分成2000个进程而不是1个。
答案 2 :(得分:1)
对于IE版本4到8,您可以在注册表中执行此操作。在Regedit中打开以下密钥:HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Styles
。如果此密钥不存在,请创建它。在此键中,创建一个名为MaxScriptStatements
的DWORD值,并为其指定值0xFFFFFFFF
(如果单击“确定”时值自动更改,请不要担心,这是正常的)。
您可以对JavaScript进行编程以自动执行此操作:
var ws = new ActiveXObject("WScript.Shell");
ws.RegWrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Styles\\","");
ws.RegWrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Styles\\MaxScriptStatements",1107296255,"REG_DWORD");