2012-10-05 27 views
11

Tôi đang cố gắng hiểu tại sao Firefox (tôi đang sử dụng 15 nhưng nó giống nhau trong hàng đêm) không hoạt động như WebKit khi cố gắng truy cập thông tin sự kiện lỗi.Làm thế nào để có được chi tiết sự kiện lỗi trong Firefox bằng cách sử dụng addEventListener?

một này hoạt động ở khắp mọi nơi:

window.onerror = function(message, lineno, filename) { } 

Nhưng tất nhiên tôi không muốn sử dụng này.

Các điều đúng đắn cần làm là:

window.addEventListener('error', function(e) { 
    console.log(e.message); 
}, false); 

Thật không may này chỉ hoạt động trong WebKit. Trong Firefox, trình xử lý được gọi, nhưng sự kiện e gần như trống: không có thông báo, không có số dòng, không có thuộc tính tên tệp.

Các thử nghiệm rất tối thiểu là ở đây: http://jsbin.com/efexiw/1/edit

Tôi không nghĩ rằng đây là một lỗi, mặc dù ... do đó, câu hỏi là: làm thế nào để tôi có được chi tiết lỗi trong Firefox gần đây?

Trả lời

23

Các HTML5 specification requires rằng một thất bại phân tích cú pháp làm cho trình duyệt:

... báo cáo lỗi cho kịch bản, với vị trí có vấn đề (số dòng và số cột), sử dụng các đối tượng toàn cầu ... như mục tiêu.

đâu "report the error" bao gồm các bước

  1. Hãy nhắn là một chuỗi user-agent xác định mô tả lỗi một cách hữu ích.

...

  1. Hãy kiện là một đối tượng mới đáng tin cậy ErrorEvent điều đó không có bong bóng nhưng có thể hủy bỏ, và trong đó có các tên sự kiện error.

  2. Initialize kiện 's message thuộc tính để nhắn.

...

  1. văn kiện tại mục tiêu.

Vì vậy, bất kỳ trình duyệt HTML5-compliant sẽ báo cáo các sự kiện lỗi phân tích cú pháp thời gian thực trên window, trong đó bao gồm một thuộc tính message thiết lập để một "chuỗi user-agent xác định mô tả lỗi một cách hữu ích. "Bất kỳ phiên bản trình duyệt nào không thực hiện được điều này vẫn chưa tuân thủ HTML5 về vấn đề này.


Trước đây (tại thời điểm câu hỏi này đã được viết), window.onerror cung cấp thông tin mà không được cung cấp bởi window.addEventListener("error"). Nếu bạn phải sử dụng một phiên bản cũ của trình duyệt Firefox, bạn có thể safely use window.onerror:

// Example 1: 

// Prevent error dialogs from displaying -which is the window's normal 
// behavior- by overriding the default event handler for error events that 
// go to the window. 
window.onerror = null; 

// Example 2: 

var gOldOnError = window.onerror; 
// Override previous handler. 
window.onerror = function myErrorHandler(errorMsg, url, lineNumber) { 
    if (gOldOnError) 
    // Call previous handler. 
    return gOldOnError(errorMsg, url, lineNumber); 

    // Just let default handler run. 
    return false; 
} 
+0

Tôi chấp nhận câu trả lời vì ít nhất tôi biết làm thế nào để xử lý tình hình. Quá tệ Tôi không hiểu tại sao Firefox _seems_ lại xóa "tính năng" này (đối với những gì tôi đã đọc trong các tìm kiếm của mình là các ví dụ cũ mà có nghĩa vụ phải làm việc trong FF và các trình duyệt khác). – Claudio

+0

Trong FF 38, ít nhất, có lẽ sớm hơn nhiều, sự kiện lỗi được cung cấp cho addEventListener có ít nhất là thông điệp, tên tệp và thuộc tính lineno ... có thể nhiều hơn. Tôi hiện đang tìm kiếm thêm, và cho bất kỳ tiêu chuẩn nào xác định cụ thể. – Victoria

+0

Chi tiết về sự kiện lỗi còn thiếu, nhưng [MDN] (https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent) hiển thị .colno có sẵn và thử nghiệm cho biết .error.stack có sẵn trong FF38. – Victoria

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