2013-08-23 189 views
7

我有一个ASP.NET MVC页面有JQuery可编辑数据表,它有14列。 我有一个按钮(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/

人有此ISSE和任何建议的高度赞赏。

这是投掷脚本消息实际代码:

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(); 

}

我在这里做错了什么?

+2

你不应该看看不显示慢代码警告消息,你应该看看优化你的代码。 –

+1

'“我在这里做错了什么?”“......你正在使用ASP.Net,呃!?不,但严重的是,罗里是正确的。你的数据表代码已经做得很多了。 ASP MVC的主要功能之一是让服务器通过C#或甚至XAML处理“计算”并编写HTML以在视图中呈现。你有没有做过电台演练?它为您提供了一个很好的想法,即如何处理更多的服务器端,并且只发送直接的HTML到您的“表”,从而减少客户端的混淆,并减少客户端错误的机会。 – SpYk3HH

+0

我添加了javascript标记并更新了标题以更相关。希望你对此好。 –

回答

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); 

你在例(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(); 
    } 

注:没有测试,只是给你一个想法如何应该可以工作

+0

我会试试这个... – Rita

+0

我试过这个,为我工作。 :-)太好了! – Rita

0

你也可以考虑HTML 5工作者

web worker是一个在后台运行的JavaScript,不会影响页面的性能。 在HTML页面中执行脚本时,页面变得无响应,直到脚本完成。 网络工作人员是一种在后台运行的独立于其他脚本的JavaScript,不会影响页面的性能。

创建新工人很简单。您只需调用Worker()构造函数,指定要在辅助线程中执行的脚本的URI,并将辅助程序的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. 

你可以看到更多的细节: https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

+3

网络工作者值得宣传 - 但不幸的是,他们不会对这个主要发生在IE8中的特殊警告提供帮助,就像这个问题一样:IE8不支持网络工作者。 – user568458

4

尽管已经接受了我想在这里把开发商一般信息的另一个答案谁将有这个问题的功能:

通过此链接,您可以找到信息如何解决此f ROM用户端http://support.microsoft.com/kb/175500 - 用户可以添加一个注册表项。

您也可以找到有出现此“运行缓慢”的消息时,有关信息:

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

正如你所看到的在JavaScript语句中测量的缓慢时间,不及时。

+1

另请参阅[在Internet Explorer中禁用长时间运行的脚本消息](http://stackoverflow.com/a/4460329/568458)的最佳答案,它有一个非常好的示例方法,可以避免跳过'5,000,000语句'开关。 – user568458