JQuery $(window).blur vs native window.onblur

В чем преимущества использования jQuery

$(window).blur(function() { ... })

чтобы связать обработчик событий с настройкой его непосредственно с помощью

window.onblur = function() { ... }

Похоже, что последний менее надежный, поскольку он поддерживает только один обработчик размытия, а при использовании с другими пакетами другой код может переопределить значение window.blur другой функцией. Однако не могло ли это также произойти и с реализацией jQuery, которая предположительно использует window.blur как свою базовую реализацию?

EDIT: Несколько человек также упомянули альтернативу window.addEventListener, которую можно использовать для добавления события 'onblur', кроме описанных выше методов.

Ответы

Ответ 1

$(window).blur(function() { ... })

Позволяет добавить один или несколько обработчиков событий.


window.onblur = function() { ... }

У вас есть только один обработчик событий, обрабатывающий событие размытия.


Первый использует механизм обработки событий jQuery. Вызов .blur() будет делегировать jQuery.fn.on(), который, в свою очередь, будет делегировать jQuery.event.add. Этот метод add() создаст свой собственный обработчик для данного типа события и сообщит addEventListener() для вызова этого обработчика всякий раз, когда запускается событие данного типа. Таким образом, в основном у jQuery есть собственный способ обработки событий, который полагается на addEventListener() для правильного выполнения.

Последний - это просто атрибут, который может содержать только одно значение, поэтому обработчики событий в очереди невозможны.

Я написал небольшую демонстрацию, чтобы доказать этот момент: http://jsfiddle.net/GnNZm/1/

Ответ 2

С помощью jQuery-метода вы можете присоединить несколько обработчиков событий. Установив window.onblur, вы можете иметь только один обработчик.

Pure JavaScript также имеет следующее: window.addEventListener(). На самом деле, я уверен, что jQuery использует это внутренне. (Да, они делают.)

(РЕДАКТИРОВАТЬ) Свойство window.onblur в основном является ярлыком для установки одного обработчика. Использование addEventListener() (или обертки jQuery) в основном создает список обработчиков событий, которые все запускаются, когда происходит событие. Я не тестировал, но думаю, что вы можете использовать их вместе. Поскольку это список, а не одно значение, несколько обработчиков не должны мешать друг другу. Их также можно удалить отдельно или сразу.

Обработчики событий jQuery, используя on(), также позволяют вам помещать ваши обработчики, чтобы предотвратить столкновения, если плагин удаляет свои обработчики. Pure JS, похоже, не так легко.

Ответ 3

Для размытия jquery

Событие размытия не пузырится в Internet Explorer. Следовательно, скрипты, которые полагаются на делегирование событий с событием размытия, не будут работать последовательно в браузерах. Однако, начиная с версии 1.4.2, jQuery работает вокруг этого ограничения, сопоставляя размытие с фокусом событие в своих методах делегирования событий .live() и .delegate().

взято из jquery doc https://api.jquery.com/blur/

Также jquery позволяет связывать несколько обработчиков событий

Ответ 4

Когда вы присоединяете событие, существует возможность перезаписать событие, уже прикрепленное к обработчику событий. Это часто случалось с window.onload(), где разные сценарии перезаписывали обработчики событий друг друга.

например:

//lightbox.js
window.onload = function() { /* do lightbox stuff */ }

//carousel.js 
window.onload = function() { /* do carousel stuff */ }

Таким образом, обычная практика была примерно такой:

var existing_event_handlers = window.onload;
window.onload = function(){

    //my event code
    alert('onready fired');

    //call other event handlers after
    existing_event_handlers();
} 

Использование window.onblur = function() { ... } по-прежнему имеет преимущество, потому что вы можете специально диктовать, если вы хотите, чтобы ваше событие срабатывало до или после других вложенных событий.

Как и многие другие ответы, уже упомянутые jQuery абстрагируют вас от большинства различий в браузере. Версия до IE9 использовала attachEvent(), а не addEventListener().