javascript - 如何在浏览器中防止 "Stop running this Script"?

标签 javascript jquery asp.net-mvc asp.net-mvc-3

我有一个 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

例子(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)中的示例代码,我更改了如下代码,但仍然收到脚本消息:

//这个函数是为了避免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/

相关文章:

javascript - Requirejs 和浏览器内存管理

javascript - 外部文件中的 AngularJs Controller 并使用路由

javascript - 将日期设置为 Jquery UI 日期选择器输入文本框

javascript - 我希望我的 Bootstrap 轮播在按下键盘左右箭头时滑动

asp.net-mvc - 在 ASP.NET MVC 中制作可下载链接

asp.net-mvc - 是否可以在同一个包中包含脚本和样式?(asp.net mvc5)

javascript - ajax请求全部返回错误500

javascript - ES5 规范对象类型

JavaScript:事件处理程序:在哪里声明变量 - 局部变量还是闭包(与开销)?

jquery - 无法使用 jQuery 更新背景图像