window.onerror, не стреляя в Firefox

Можем ли мы жить без комментариев к коду? Конечно, но это не облегчит жизнь.

17
задан elemjay19 22 June 2009 в 21:14
поделиться

3 ответа

Следующее проверено и работает в 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, удалить свой локальный профиль (ы) (информация о том, как найти свой профиль, доступна здесь ), переустановить последнюю версию и снова протестировать.

23
ответ дан 30 November 2019 в 12:20
поделиться

Не забудьте вернуть true из любого настраиваемого обработчика window.onerror, иначе firefox все равно обработает его.

7
ответ дан 30 November 2019 в 12:20
поделиться

Похоже, есть открытая ошибка (# 3982) в jQuery 1.3.x - Событие jQuery.error получает неверные аргументы . Последнее обновление было 2 месяца назад с комментарием:

Учитывая, насколько сумасшедшим является событие ошибки, и как часто он используется, согласен что проще всего удалить опору для этого. Я добавил примечание к документам уже, так как это все равно не сработало.

Думаю, я бы сам установил window.onerror, аналогично тому, что опубликовал Грант. Кроме того, FireFox: addEventListener Vs. window.onerror упоминает, что "element.addEventListener", вызывающий ошибку, не активирует "window.onerror" .

2
ответ дан 30 November 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: