如何在浏览器中阻止“停止运行此脚本”?

我有一个ASP.NET MVC页面,其中包含14列的JQuery Editable Datatable。 我有一个按钮(Apply No Findings)来做客户端计算并且适用于该表中的所有行。

当我们单击此按钮时,在每4行应用计算后,它将显示此“停止运行脚本”消息。

我validation了设置。 在“Internet选项”的“高级”选项卡中,“禁用脚本调试(Internet Explorer)”选项已选中。 并且“未显示”显示有关脚本错误的通知“。

我正在使用Internet Explorer 8.我现在不会在IE9上发生。 但这是服务器,我们无法升级到IE9。

我做了研究并尝试了这两个选项,没有任何效果。

例(1): http //www.codeproject.com/Tips/406739/Preventing-Stop-running-this-script-in-Browsers

示例(2): http //www.picnet.com.au/blogs/guido/post/2010/03/04/how-to-prevent-stop-running-this-script-message-in-browsers/

任何人都有这个,任何建议都非常感谢。

这是抛出脚本消息的实际代码:

for(i < iTotalRecords;i++) { var row = oTableAuditLines.fnGetData(i); oTableAuditLines.fnUpdate("NF",i,1); UndoHCPCS(row,i); UndoHCPCSModCodes(row,i); UndoLineUnitCount(row,i); oTableAuditLines.fnUpdate("", i, 6); //Reset Denial Reason Code UndoNonCoveredCharges(row,i); CalculateAmountPaidAtLine(row,i); CalculateEstimatedRecoveryAmountAtLine(row,i); } UpdateSummaryLine(); UpdateSummaryLineReasonCode(); 

通过引用示例(2)中的示例代码,我更改了下面的代码,我仍然收到脚本消息:

//此函数用于避免脚本运行消息

  RepeatingOperation = function(op, yieldEveryIteration) { var count = 0; var instance = this; this.step = function(args) { if (++count >= yieldEveryIteration) { count = 0; setTimeout(function() { op(args); }, 1, []) return; } op(args); }; }; function ApplyNoFindings() { var i = 0; var ro = new RepeatingOperation(function() { var row = oTableAuditLines.fnGetData(i); oTableAuditLines.fnUpdate("NF",i,1); UndoHCPCS(row,i); UndoHCPCSModCodes(row,i); UndoLineUnitCount(row,i); oTableAuditLines.fnUpdate("", i, 6); //Reset Denial Reason Code UndoNonCoveredCharges(row,i); CalculateAmountPaidAtLine(row,i); CalculateEstimatedRecoveryAmountAtLine(row,i); if (++i < iTotalRecords) { ro.step(); } else { UpdateSummaryLine(); UpdateSummaryLineReasonCode(); } }, 100); ro.step(); 

}

我在这做错了什么?

问题是javascript是单线程的,所以如果有一个函数需要很长时间才能完成 ,这个函数可能会导致UI没有响应。 因此,浏览器将通过显示消息“停止运行此脚本”来警告用户长时间运行的脚本。 这个问题的解决方案是:

  • 优化您的代码,使function不需要这么长时间。
  • 使用setTimeout将函数执行分解为很多足够短的部分。

示例代码模式:

 var array = []; //assume that this is a very big array var divideInto = 4; var chunkSize = rowCount/divideInto; var iteration = 0; setTimeout(function doStuff(){ var base = chunkSize * iteration; var To = Math.min(base+chunkSize,array.length); while (base < To ){ //process array[base] base++; } iteration++; if (iteration < divideInto) setTimeout(doStuff,0); //schedule for next phase },0); 

您在示例(2)中采用的解决方案是正确的,但代码中存在问题。 那就是setTimeout没有运行 。 尝试更改您的代码,如下所示:

 RepeatingOperation = function(op, yieldEveryIteration) { var count = 0; var instance = this; this.step = function(args) { op(args); if (++count <= yieldEveryIteration) { setTimeout(function() { instance.step(args); }, 1, []) } }; }; 

修改你的function ApplyNoFindings() ,试试这个:

 if (++i > iTotalRecords) { UpdateSummaryLine(); UpdateSummaryLineReasonCode(); } 

代替:

 if (++i < iTotalRecords) { ro.step(); } else { UpdateSummaryLine(); UpdateSummaryLineReasonCode(); } 

注意:未经测试,只需告诉您它应该如何工作

尽管已经接受了另一个答案,但我想在此处提供一些信息,供开发人员解决此问题:

通过此链接,您可以从用户端http://support.microsoft.com/kb/175500找到有关如何解决此问题的信息 – 用户可以添加一个注册表项。

您还可以找到有关何时显示“运行缓慢”消息的信息:

默认情况下,密钥不存在。 如果尚未添加密钥,则超时对话框的默认阈值限制为Internet Explorer 4及更高版本的5,000,000个语句

当你看到在javascript语句中测量的缓慢,而不是及时。

您还可以考虑HTML 5工作者

Web worker是在后台运行的JavaScript,不会影响页面的性能。 在HTML页面中执行脚本时,页面将变为无响应,直到脚本完成。 Web worker是一种在后台运行的JavaScript,与其他脚本无关,不会影响页面的性能。

创建新员工很简单。 您需要做的就是调用Worker()构造函数,指定要在工作线程中执行的脚本的URI,将worker的Worker.onmessage属性设置为适当的事件处理函数。

 var myWorker = new Worker("my_task.js"); myWorker.onmessage = function (oEvent) { console.log("Called back by the worker!\n"); }; 

或者,您可以使用addEventListener():

 var myWorker = new Worker("my_task.js"); myWorker.addEventListener("message", function (oEvent) { console.log("Called back by the worker!\n"); }, false); myWorker.postMessage(""); // start the worker. 

您可以在以下url查看更多详细信息: https : //developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers