2009-06-17 48 views
17

Tôi đang cố tạo cơ sở hạ tầng ghi lỗi javascript.window.onerror không kích hoạt trong Firefox

Tôi đang cố gắng đặt window.onerror làm trình xử lý lỗi của mình. Nó hoạt động trong IE 6, nhưng khi tôi chạy nó trong Firefox, nó chạy vào một số phương pháp xung đột onerror.

var debug = true; 

MySite.Namespace.ErrorLogger.prototype = { 

    //My error handling function. 
    //If it's not in debug mode, I should get an alert telling me the error. 
    //If it is, give a different alert, and let the browser handle the error. 
    onError: function(msg, url, lineNo) { 
     alert('onError: ' + msg); 
     if (!debug) { 
      alert('not debug mode'); 
      return true; 
     } 
     else { 
      alert(msg); 
      return false; 
     } 
    } 
} 

//Document ready handler (jQuery shorthand) 
$(function() { 
    log = $create(MySite.Namespace.ErrorLogger); 

    window.onerror = log.onError; 

    $(window).error(function(msg, url, line) { 
     log.onError(msg, url, line); 
    }); 
}); 

Nếu tôi sử dụng setTimeout("eval('a')", 1); nơi 'a' là một biến không xác định, xử lý lỗi của tôi là những gì đang bị sa thải (nó hoạt động). Tuy nhiên, trình ghi lỗi của tôi cần nắm bắt tất cả các lỗi do khách hàng truy cập vào trang web, không chỉ mã không chính xác ở một nơi.

Mã này là trên một trang .js đang được gọi là từ trang cơ sở (C#) của một trang web. Trang này cũng sử dụng jQuery, vì vậy tôi có một hàm ghi đè hàm liên kết jQuery và hàm đó hoạt động tốt trong cả Firefox 3 và IE 6.

Tôi biết rằng Firefox đang gặp lỗi vì nó xuất hiện trong cả hai Bảng điều khiển lỗi và Firebug, nhưng chức năngwindow.onerror của tôi vẫn chưa được gọi.

Bất kỳ suy nghĩ về cách ghi đè lên những gì Firefox đang làm gì?

+2

Một người khác trong nhóm của tôi đã tiếp quản dự án này và hoàn toàn thay đổi mọi thứ tôi đã làm, vì vậy tôi sẽ không bao giờ biết điều gì là sai. –

Trả lời

23

Sau đây là thử nghiệm và làm việc trong IE 6 và Firefox 3.0.11:

<html> 
<head> 
<title>Title</title> 
</head> 
<body> 
    <script type="text/javascript"> 
    window.onerror = function (msg, url, num) { 
     alert(msg + ';' + url + ';' + num); 
     return true; 
    } 
    </script> 
    <div> 
    ...content... 
    </div> 
    <script type="text/javascript"> 
    blah; 
    </script> 
</body> 
</html> 

Nếu một số thư viện JavaScript khác mà bạn đang tải cũng được gắn bản thân để window.onerror bạn có thể làm điều này:

<script type="text/javascript"> 
function addHandler(obj, evnt, handler) { 
    if (obj.addEventListener) { 
     obj.addEventListener(evnt.replace(/^on/, ''), handler, false); 
    // Note: attachEvent fires handlers in the reverse order they 
    // were attached. This is the opposite of what addEventListener 
    // and manual attachment do. 
    //} else if (obj.attachEvent) { 
    // obj.attachEvent(evnt, handler); 
    } else { 
     if (obj[evnt]) { 
      var origHandler = obj[evnt]; 
      obj[evnt] = function(evt) { 
       origHandler(evt); 
       handler(evt); 
      } 
     } else { 
      obj[evnt] = function(evt) { 
       handler(evt); 
      } 
     } 
    } 
} 
addHandler(window, 'onerror', function (msg, url, num) { 
    alert(msg + ';' + url + ';' + num); 
    return true; 
}); 
addHandler(window, 'onerror', function (msg, url, num) { 
    alert('and again ' + msg + ';' + url + ';' + num); 
    return true; 
}); 
</script> 

Ở trên cho phép bạn đính kèm nhiều bộ xử lý onerror như bạn muốn. Nếu đã có trình xử lý tùy chỉnh hiện tại onerror, trình xử lý này sẽ gọi trình xử lý đó, sau đó là của bạn.

Lưu ý rằng addHandler() thể được sử dụng để ràng buộc nhiều bộ xử lý bất kỳ sự kiện:

addHandler(window, 'onload', function() { alert('one'); }); 
addHandler(window, 'onload', function() { alert('two'); }); 
addHandler(window, 'onload', function() { alert('three'); }); 

Mã này là mới và có phần thực nghiệm. Tôi không chắc chắn 100% addEventListener thực hiện chính xác những gì các tập tin đính kèm hướng dẫn sử dụng, và như bình luận, attachEvent bắn các trình xử lý theo thứ tự ngược lại chúng được đính kèm trong (vì vậy bạn sẽ thấy 'ba, hai, một' trong ví dụ trên). Mặc dù không nhất thiết là "sai" hoặc "không chính xác", điều này ngược lại với mã khác trong addHandler và do đó, có thể dẫn đến hành vi không nhất quán từ trình duyệt đến trình duyệt, đó là lý do tôi xóa nó.

EDIT:

Đây là một trường hợp thử nghiệm đầy đủ để chứng minh sự kiện onerror:

<html> 
<head> 
<title>Title</title> 
</head> 
<body> 
<script type="text/javascript"> 
function addHandler(obj, evnt, handler) { 
    if (obj.addEventListener) { 
     obj.addEventListener(evnt.replace(/^on/, ''), handler, false); 
    } else { 
     if (obj[evnt]) { 
      var origHandler = obj[evnt]; 
      obj[evnt] = function(evt) { 
       origHandler(evt); 
       handler(evt); 
      } 
     } else { 
      obj[evnt] = function(evt) { 
       handler(evt); 
      } 
     } 
    } 
} 
addHandler(window, 'onerror', function (msg, url, num) { 
    alert(msg + ';' + url + ';' + num); 
    return true; 
}); 
</script> 
<div> 
...content... 
</div> 
<script type="text/javascript"> 
blah; 
</script> 
</body> 
</html> 

Khi mã trên được đưa vào test.htm và nạp vào Internet Explorer từ idks địa phương, bạn sẽ thấy một hộp thoại có nội dung là 'blah' is undefined;undefined;undefined.

Khi mã trên được đưa vào test.htm và nạp vào Firefox 3.0.11 (và mới nhất 3.5 khi chỉnh sửa này - Gecko/20090616) từ đĩa cục bộ, bạn sẽ thấy một hộp thoại có nội dung [object Event];undefined;undefined. Nếu điều đó không xảy ra thì bản sao Firefox của bạn không được cấu hình đúng cách hoặc bị hỏng. Tất cả những gì tôi có thể đề nghị là bạn xóa Firefox, xóa (các) hồ sơ cục bộ của bạn (thông tin về cách tìm hồ sơ của bạn có sẵn here) và cài đặt lại phiên bản mới nhất và kiểm tra lại.

+0

Câu lệnh if là những gì được kích hoạt trên các sự kiện mà tôi muốn xử lý bởi trình ghi lỗi của tôi trong Firefox. Sự liên quan của addEventListener được tạo ra trong câu lệnh if là gì? –

+0

Điều duy nhất xảy ra với điều này là bất cứ lúc nào tôi mở Firefox, bất cứ điều gì tôi đặt trong câu lệnh "if" đều kích hoạt. Nó không phải là một phản ứng với lỗi của tôi mặc dù. –

+0

addHandler() là một cách tổng quát để thêm nhiều hàm xử lý vào một sự kiện. Kiểm tra if (obj.addEventListener) để xem trình duyệt có hỗ trợ phương thức addEventListener() trên đối tượng không, nếu có, nó sẽ thêm một trình xử lý bằng cách sử dụng phương thức được hỗ trợ của trình duyệt tích hợp sẵn. Nếu trình duyệt không hỗ trợ phương thức addEventListener(), nó sẽ xử lý trình xử lý mới của bạn sau trình xử lý được thêm gần đây nhất. –

7

Hãy nhớ trả lại đúng từ bất kỳ cửa sổ tùy chỉnh nào.truy cập bộ xử lý hoặc firefox sẽ vẫn xử lý nó.

2

Dường như có lỗi mở (# 3982) trong jQuery 1.3.x - jQuery.error event gets incorrect arguments. Bản cập nhật mới nhất là 2 tháng trước với lời nhận xét:

Với cách điên trường hợp lỗi là, và thường xuyên như thế nào nó được sử dụng, tôi đồng ý rằng đó là dễ dàng nhất để loại bỏ hỗ trợ cho nó. Tôi đã thêm ghi chú vào tài liệu vì nó chưa hoạt động.

Tôi đoán tôi sẽ chỉ đặt window.onerror cho mình, tương tự như những gì Grant đã đăng. Ngoài ra, FireFox: addEventListener Vs. window.onerror đề cập rằng "element.addEventListener", gây ra lỗi không kích hoạt "window.onerror".