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.
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. –