Можем ли мы жить без комментариев к коду? Конечно, но это не облегчит жизнь.
Следующее проверено и работает в IE 6 и 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>
Если какая-то другая библиотека JavaScript, которую вы загружаете, также присоединяется к window.onerror
, вы можете сделать это:
<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>
Вышеупомянутое позволяет вам присоединить столько обработчиков onerror
, сколько захотите. Если уже существует настраиваемый обработчик onerror
, он вызовет его, а затем ваш.
Обратите внимание, что addHandler ()
может использоваться для привязки нескольких обработчиков к любому событию:
addHandler(window, 'onload', function () { alert('one'); });
addHandler(window, 'onload', function () { alert('two'); });
addHandler(window, 'onload', function () { alert('three'); });
Этот код новый и несколько экспериментальный. Я' m не уверен на 100%, что addEventListener делает именно то, что делает ручное вложение, и, как уже было сказано, attachEvent запускает обработчики в обратном порядке, в котором они были подключены (так что вы увидите 'три, два, один 'в приведенном выше примере). Хотя это не обязательно «неправильный» или «неправильный», это противоположно тому, что делает другой код в addHandler
, и в результате может привести к несогласованному поведению от браузера к браузеру, поэтому я удалил его. .
РЕДАКТИРОВАТЬ:
Это полный тестовый пример для демонстрации события 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>
Когда приведенный выше код помещается в test.htm и загружается в Internet Explorer из локальных идентификаторов, вы должны увидеть диалоговое окно который говорит «бла» не определено; undefined; undefined
.
Когда приведенный выше код подвергается проверке. htm и загружен в Firefox 3.0.11 (и последнюю версию 3.5 на момент редактирования - Gecko / 20090616) с локального диска, вы должны увидеть диалоговое окно с надписью [событие объекта]; undefined; undefined
. Если этого не происходит, значит, ваша копия Firefox неправильно настроена или повреждена иным образом. Все, что я могу предложить, - это удалить Firefox, удалить свой локальный профиль (ы) (информация о том, как найти свой профиль, доступна здесь ), переустановить последнюю версию и снова протестировать.
Не забудьте вернуть true из любого настраиваемого обработчика window.onerror, иначе firefox все равно обработает его.
Похоже, есть открытая ошибка (# 3982) в jQuery 1.3.x - Событие jQuery.error получает неверные аргументы . Последнее обновление было 2 месяца назад с комментарием:
Учитывая, насколько сумасшедшим является событие ошибки, и как часто он используется, согласен что проще всего удалить опору для этого. Я добавил примечание к документам уже, так как это все равно не сработало.
Думаю, я бы сам установил window.onerror, аналогично тому, что опубликовал Грант. Кроме того, FireFox: addEventListener Vs. window.onerror упоминает, что "element.addEventListener", вызывающий ошибку, не активирует "window.onerror" .