【问题标题】:How to prevent "Stop running this Script" in browsers?如何防止浏览器中的“停止运行此脚本”?
【发布时间】:2013-08-26 12:59:53
【问题描述】:

我有一个 ASP.NET MVC 页面,其中包含 14 列的 JQuery 可编辑数据表。 我有一个按钮(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();

通过参考示例(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();

}

我在这里做错了什么?

【问题讨论】:

  • 你不应该着眼于不显示慢代码警告消息,你应该着眼于优化你的代码。
  • "What am i doing wrong here?" ...您使用的是 ASP.Net,呵呵!?不,但说真的,罗里是正确的。您的数据表代码已经做了很多工作。 ASP MVC 的主要功能之一是能够让服务器通过 C# 甚至 XAML 处理“计算”并编写要在视图中呈现的 HTML。你做过无线电演练吗?它为您提供了如何处理更多此服务器端的好主意,并且只将直接 HTML 发送到您的“表”,从而减少客户端的混乱并减少客户端错误的机会。
  • 我添加了 javascript 标签并更新了标题以使其更具相关性。希望你没问题。

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


【解决方案1】:

问题是 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, [])         
       }    
    };   
  };

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

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

代替:

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

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

【讨论】:

    【解决方案2】:

    尽管已经接受了另一个答案,但我想在此处为在功能上遇到此问题的开发人员提供一般信息:

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

    您还可以在此处找到有关何时出现此“运行缓慢”消息的信息:

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

    正如您所见,速度是用 javascript 语句衡量的,而不是时间。

    【讨论】:

    【解决方案3】:

    您也可以考虑使用 HTML 5 工作者

    Web Worker 是在后台运行的 JavaScript,不会影响页面的性能。 在 HTML 页面中执行脚本时,页面会变得无响应,直到脚本完成。 Web Worker 是在后台运行的 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

    【讨论】:

    • 网络工作者值得宣传 - 但不幸的是,他们不会帮助解决这个主要出现在 IE8 中的特定警告,如以下问题:IE8 不支持网络工作者。
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多