我有一个 ASP.NET MVC 页面,其中包含 14 列的 JQuery 可编辑数据表。 我有一个按钮(应用无结果)来进行客户端计算并应用该表中的所有行。
当我们单击此按钮时,在对每 4 行应用计算后,它会显示此“停止运行脚本”消息。
我验证了设置。在 Internet 选项的高级选项卡中,选中“禁用脚本调试 (Internet Explorer)”选项。并且未选中“显示有关脚本错误的通知”。
我正在使用 Internet Explorer 8。我现在在 IE9 上不会发生这种情况。但这是服务器,我们无法升级到 IE9。
我做了研究并尝试了这两个选项,但没有任何效果。
示例(1): http://www.codeproject.com/Tips/406739/Preventing-Stop-running-this-script-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)中的示例代码,我更改了如下代码,但仍然收到脚本消息:
//这个函数是为了避免Script Running Message
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 没有响应。因此,浏览器将通过显示消息警告用户有关长时间运行的脚本:“停止运行此脚本”。这个问题的解决方案是:
- 优化您的代码,使函数不会花费这么长时间。
- 使用
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);
你在Example(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, [])
}
};
};
修改你的函数ApplyNoFindings()
,试试这个:
if (++i > iTotalRecords)
{
UpdateSummaryLine();
UpdateSummaryLineReasonCode();
}
代替:
if (++i < iTotalRecords)
{
ro.step();
}
else
{
UpdateSummaryLine();
UpdateSummaryLineReasonCode();
}
注意:未测试,只是让您了解它应该如何工作
关于javascript - 如何在浏览器中防止 "Stop running this Script"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18403448/