2013-08-23 33 views
7

Tôi có trang ASP.NET MVC có Chỉnh sửa có thể chỉnh sửa JQuery có 14 cột. Tôi có một nút (Áp dụng Không có Kết quả) để thực hiện các tính toán phía khách hàng snd áp dụng cho tất cả các Hàng trong bảng đó.Làm cách nào để ngăn chặn "Dừng chạy tập lệnh này" trong trình duyệt?

Khi chúng tôi nhấp vào nút này, sau khi áp dụng tính toán cho mỗi 4 Hàng, nó sẽ hiển thị thông báo "Dừng chạy tập lệnh" này.

Tôi đã xác minh cài đặt. Trong Tùy chọn Internet, tab Nâng cao, "Tùy chọn Tắt gỡ lỗi Script (Internet Explorer)" được chọn. Và "Hiển thị thông báo về lỗi tập lệnh" được bỏ chọn.

Tôi đang sử dụng Internet Explorer 8. Hiện tại, điều này không xảy ra trên IE9. Nhưng đây là máy chủ, chúng tôi không thể nâng cấp lên IE9.

Tôi đã nghiên cứu và thử hai tùy chọn này và không có gì hiệu quả.

Ví dụ (1): http://www.codeproject.com/Tips/406739/Preventing-Stop-running-this-script-in-Browsers

Ví dụ (2): http://www.picnet.com.au/blogs/guido/post/2010/03/04/how-to-prevent-stop-running-this-script-message-in-browsers/

Bất cứ ai cũng có Isse này và bất cứ đề nghị được đánh giá cao.

Đây là mã thực tế mà là ném nhắn Script:

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

Bằng cách giới thiệu mẫu mã trong ví dụ (2), tôi đã thay đổi mã như dưới đây và tôi vẫn nhận được thông báo Script:

// chức năng này là để tránh Script Chạy nhắn

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

}

Tôi đang làm gì sai ở đây?

+2

Bạn không nên xem xét không hiển thị thông báo cảnh báo mã chậm, bạn nên xem xét tối ưu hóa mã của mình. –

+1

'" Tôi đang làm gì sai ở đây? "... ... Bạn đang sử dụng ASP.Net, duh !? Không, nhưng nghiêm túc, Rory là chính xác. Mã bảng dữ liệu của bạn đã làm rất nhiều. Một trong những quyền hạn chính của ASP MVC là khả năng để cho máy chủ, thông qua C# hoặc thậm chí XAML, xử lý "tính toán" và viết HTML được trình bày trong khung nhìn. Bạn đã bao giờ thực hiện hướng dẫn Radio chưa? Nó cung cấp cho bạn một ý tưởng tốt về cách xử lý nhiều hơn về phía máy chủ này và không gửi gì ngoài HTML thẳng tới "bảng" của bạn, do đó tạo ra ít khách hàng nhầm lẫn hơn và gây ít cơ hội hơn cho các lỗi phía máy khách. – SpYk3HH

+0

Tôi đã thêm thẻ javascript và cập nhật tiêu đề để phù hợp hơn. Hy vọng bạn ổn với điều này. –

Trả lời

11

Vấn đề là javascript là đơn luồng, vì vậy nếu có một chức năng mà mất quá nhiều thời gian để hoàn thành, chức năng này có thể gây ra các giao diện người dùng không đáp ứng. Do đó, trình duyệt sẽ cảnh báo người dùng về tập lệnh chạy dài bằng cách hiển thị thông báo: "Dừng chạy tập lệnh này". Các giải pháp cho vấn đề này là:

  • Tối ưu hóa mã của bạn để chức năng không mất quá nhiều thời gian.
  • Sử dụng setTimeout để ngắt thực thi hàm thành nhiều phần đủ ngắn. mẫu mã

Ví dụ:

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

Các giải pháp bạn có trong ví dụ (2) của bạn là đúng, nhưng có một vấn đề trong mã của bạn. Đó là setTimeout không chạy.Hãy thử thay đổi mã của bạn như thế này:

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

Sửa function ApplyNoFindings() của bạn, hãy thử này:

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

thay vì:

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

Lưu ý: không được kiểm tra, chỉ cần cung cấp cho bạn một ý tưởng làm thế nào nó nên làm việc

+0

Tôi sẽ thử ... – Rita

+0

Tôi đã thử điều này và làm việc cho tôi. :-) Tuyệt quá! – Rita

0

Bạn cũng có thể xem xét công nhân HTML 5

Nhân viên web là một JavaScript chạy trong nền, mà không ảnh hưởng đến hiệu suất của trang. Khi thực thi tập lệnh trong trang HTML, trang sẽ không phản hồi cho đến khi tập lệnh hoàn tất. Nhân viên web là một JavaScript chạy trong nền, độc lập với các tập lệnh khác, mà không ảnh hưởng đến hiệu suất của trang.

Tạo công nhân mới thật đơn giản. Tất cả những gì bạn cần làm là gọi hàm tạo Worker(), chỉ định URI của một tập lệnh để thực thi trong luồng công nhân, đặt thuộc tính Worker.onmessage của nhân viên thành một hàm xử lý sự kiện thích hợp.

var myWorker = new Worker("my_task.js"); 

myWorker.onmessage = function (oEvent) { 
    console.log("Called back by the worker!\n"); 
}; 

Ngoài ra, bạn có thể sử dụng 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. 

Bạn có thể xem chi tiết tại địa chỉ: https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

+3

Nhân viên Web đáng được quảng bá - nhưng thật không may, họ sẽ không trợ giúp với cảnh báo đặc biệt này mà chủ yếu xảy ra trong IE8 như trong câu hỏi này: IE8 không hỗ trợ công nhân web. – user568458

4

Mặc dù câu trả lời khác đã chấp nhận tôi muốn đặt ở đây thông tin chung cho các nhà phát triển ai sẽ gặp vấn đề này trong tính năng:

Bằng liên kết này, bạn có thể tìm thông tin về cách sửa lỗi này bên người dùng rom http://support.microsoft.com/kb/175500 - người dùng có thể thêm một khóa Đăng ký.

Ngoài ra bạn có thể tìm thấy ở đó thông tin về khi điều này "Chạy chậm" thông báo xuất hiện:

Theo mặc định, chìa khóa không tồn tại. Nếu khóa chưa được thêm, giới hạn ngưỡng mặc định cho hộp thoại hết giờ là 5.000.000 câu lệnh cho Internet Explorer 4 và các phiên bản mới hơn.

Khi bạn thấy tốc độ chậm được đo trong báo cáo javascript, không đúng lúc.

+1

Xem thêm câu trả lời hàng đầu cho [Tắt thông báo tập lệnh chạy dài trong Internet Explorer] (http://stackoverflow.com/a/4460329/568458) có phương pháp ví dụ tiện lợi để tránh vấp nút chuyển 'báo cáo 5.000.000' . – user568458

Các vấn đề liên quan