Назначает ли функция window.onerror предпочтительнее window.addEventListener('error', callback)?

Назначение функции для window.onerror кажется довольно простым способом начать обработку ошибок в коде на странице. Однако важно убедиться, что вы не перезаписываете ранее существующий обработчик ошибок, поэтому обычно рекомендуется сохранять ссылку на предыдущее значение и вызывать его как часть вашей новой функции. В качестве примера:

var old_onerror = window.onerror;
window.onerror = function() {
    // do something
    if (old_onerror) {
        old_onerror();
    }
};

Большинство документации/постов в блогах/и т.д., которые я могу найти в Интернете, рекомендует делать что-то подобное. Почему они не рекомендуют добавлять обработчик событий для события 'error'? Это позволяет вызывать несколько функций при запуске одного из этих событий и не требует неловкого обслуживания ссылок на другие обработчики ошибок.

window.addEventListener('error', function() {/* do something */});

Редактировать: я рассмотрел следующие стандартные рекомендации по этому вопросу, но событие error в window представляется довольно особым случаем (см., Например, явное отсутствие его поддержки в JQuery (найдите на этой странице "onerror")). Я специально ищу понимание того, почему onerror является особым случаем.

Ответ 1

По историческим причинам эти window.onerror - это особый случай. Большинство из них больше не работают, я думаю, что вам нужно вернуться в IE8, чтобы найти браузер, который нуждался в них. Примерно десять лет назад IE6 был королем, и у него вообще не было поддержки addEventListener, а многие события поддерживались только некоторыми браузерами или имели разные имена. Раньше веб-разработка была крайне противоречивой, и нередко находили старые методы, такие как window.onerror.

Из-за обратной совместимости window.onerror немного странный, так как два способа подписки на событие принимают разные аргументы.

Таким образом, устаревшая onerror включает в себя параметры ошибок в качестве параметров:

window.onerror = function(message, source, line, col, error) {
    ...

    return true; // This will prevent further event propagation
};

Это все еще так, что старый JS, который уже существует, не сломается - дизайнеры браузеров хотят, чтобы десятилетние веб-сайты в основном работали в своих последних версиях.

В то время как прослушиватель событий (в настоящее время рекомендуется) имеет их как свойства для события:

window.addEventListener('error', e => {

    // Get the error properties from the error event object
    const { message, source, lineno, colno, error } = e; 
});

Последнее намного лучше, так как вам не нужно получать никаких предыдущих слушателей, и никакие последующие слушатели (скажем, из расширений браузера) не будут случайно прерывать ваши. Также вы можете удалить своего слушателя, если вы создаете что-то вроде SPA, где вы остаетесь на одной странице с одним контекстом window.

Итак, чтобы ответить на вопрос:

Большинство документации/постов в блогах/и т.д., которые я могу найти в Интернете, рекомендует делать что-то подобное. Почему они не рекомендуют добавлять обработчик событий для события error?

Потому что они устарели. Поддерживать документацию в актуальном состоянии сложно, и JS быстро движется. Описанный вами шаблон window.onerror прежнему является приемлемым компромиссом в некоторых корпоративных средах, где необходимо поддерживать крайне устаревшие версии IE. Для подавляющего большинства веб- addEventListener метод addEventListener намного лучше.

см., например, явное отсутствие поддержки JQuery (найдите на этой странице "onerror")

JQuery старый. Есть некоторые решения, которые были приняты в 2006-2008 гг. Или около того, что теперь они застряли навсегда, и некоторые предположения, которые .on делает в отношении событий, являются одним из таких. jQuery .on был великолепен в 2006 году, потому что нам не нужно было беспокоиться о реализации событий в разных браузерах - он мог скрыть их всех за общим интерфейсом. Теперь все использует addEventListener поэтому он вам не нужен (и он намного мощнее, чем .on).