Почему «событие» доступно глобально в Chrome, но не в Firefox?

#javascript

#javascript #jquery #обработка событий #глобальный #jquery-события

Вопрос:

Во время работы над ответом на другой вопрос возникла странная ошибка, связанная с тем, что event объект был доступен в анонимной функции без передачи. В Chrome приведенное ниже работает нормально, но Firefox выдает ошибку.

 $(document).ready(function() {
  $("#uspsSideboxTrackingClose").click(function() {
    event.preventDefault();
    console.log(event);
  });
});
  

Chrome:

введите описание изображения здесь

FireFox:

Ошибка ссылки: событие не определено


Уже известно, что

 $("#uspsSideboxTrackingClose").click(function(event) { .. }
  

работает в обоих браузерах. Вот код-нарушитель. Это ошибка в Chrome или Firefox или предполагаемое поведение обоих браузеров? Какой браузер подходит?

Комментарии:

1. Вы, вероятно, имели в виду $("#uspsSideboxTrackingClose").click(function(event) { , не так ли?

2. Да! Совершенно верно. Спасибо.

3. Также обратите внимание, что я вижу ту же ошибку в IE10

Ответ №1:

В IE объект event был глобальным объектом (который не передается функции-обработчику), но к нему обращаются как к глобальному объекту. Вы также можете получить к нему доступ как к свойству объекта window, например window.event

В FF и других браузерах объект event был передан в качестве аргумента, поскольку в FF не вызывается глобальное свойство event , вы получаете сообщение об ошибке.

В Chrome добавлена поддержка обеих этих функций, поэтому вы получите объект event в качестве глобальной ссылки и в качестве аргумента.

Но поскольку вы используете jQuery, jQuery нормализует эти два поведения и всегда будет передавать объект event в качестве аргумента обработчику события.

 $(document).ready(function () {
    $("#uspsSideboxTrackingClose").click(function (event) {
        event.preventDefault();
        console.log(event);
    });
});
  

Комментарии:

1. Имеет смысл. Зачем им это делать?

2. Поддерживаете функцию? Я бы назвал это «сохранить совместимость с ошибкой M $».

3. то же самое выдает ошибку и в ie, хотя это странно, исходя из глобального объекта… но из-за длительной работы с jQuery мне кажется нормальным

4. Спасибо за подробный и ясный ответ, также объясняющий об IE. Молодец.

5. Документация, на которую вы ссылаетесь, очень устарела. Только очень старые версии Internet Explorer не поддерживают передачу объекта event в качестве первого аргумента функции-обработчика событий.