проверена и работает в 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'); });
Этот код является новым и несколько экспериментальным. Я не уверен на 100% addEventListener делает именно то, что делает ручное вложение, и, как прокомментировал, attachEvent запускает обработчики в обратном порядке, в которые они были прикреплены (так что вы увидите «три, два, один» в примере выше). Хотя это и не обязательно «неправильно» или «неверно», это противоположно тому, что делает другой код в addHandler
и, как результат, может привести к непоследовательному поведению браузера в браузер, поэтому я его удалил.
EDIT:
Это полный тест, чтобы продемонстрировать 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 от местного idks, вы должен увидеть диалоговое окно, которое сообщает 'blah' is undefined;undefined;undefined
.
Когда вышеуказанный код помещается в test.htm и загружается в Firefox 3.0.11 (и последние 3.5 с этого изменения - Gecko/20090616) с локального диска, вы должны увидеть диалоговое окно, в котором указано [object Event];undefined;undefined
. Если этого не происходит, то ваша копия Firefox не настроена корректно или иначе нарушена. Все, что я могу предложить, это удалить Firefox, удалить локальные профили (информация о том, как найти ваш профиль, доступна here) и переустановить последнюю версию и снова проверить.
Кто-то еще в моей группе взял на себя этот проект и полностью изменил все, что я делал, поэтому я никогда не узнаю, что случилось. –