Rit*_*ita 8 javascript asp.net-mvc jquery asp.net-mvc-3
我有一个ASP.NET MVC页面,其中包含14列的JQuery Editable Datatable.我有一个按钮(Apply No Findings)来做客户端计算并且适用于该表中的所有行.
当我们单击此按钮时,在每4行应用计算后,它将显示此"停止运行脚本"消息.
我验证了设置.在"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();
Run Code Online (Sandbox Code Playgroud)
通过引用示例(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();
Run Code Online (Sandbox Code Playgroud)
}
我在这做错了什么?
Kha*_* TO 11
问题是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);
Run Code Online (Sandbox Code Playgroud)
您在示例(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, [])
}
};
};
Run Code Online (Sandbox Code Playgroud)
修改你的function ApplyNoFindings(),试试这个:
if (++i > iTotalRecords)
{
UpdateSummaryLine();
UpdateSummaryLineReasonCode();
}
Run Code Online (Sandbox Code Playgroud)
代替:
if (++i < iTotalRecords)
{
ro.step();
}
else
{
UpdateSummaryLine();
UpdateSummaryLineReasonCode();
}
Run Code Online (Sandbox Code Playgroud)
注意:未经测试,只需告诉您它应该如何工作
| 归档时间: |
|
| 查看次数: |
36005 次 |
| 最近记录: |