jQuery-эквивалент метода JavaScript addEventListener
Я пытаюсь найти jQuery-эквивалент этого вызова метода JavaScript:
document.addEventListener('click', select_element, true);
Я получил, насколько:
$(document).click(select_element);
но это не дает того же результата, что и последний параметр метода JavaScript - логическое значение, указывающее, должен ли обработчик событий выполняться на этапе захвата или всплытия (согласно моему пониманию на http://www.quirksmode.org/js/events_advanced.html) - исключено.
Как мне указать этот параметр или иным образом достичь той же функциональности, используя jQuery?
6 ответов
Не все браузеры поддерживают захват событий (например, версии Internet Explorer менее 9), но не все поддерживают всплывающее окно событий, поэтому именно эта фаза используется для привязки обработчиков к событиям во всех кросс-браузерных абстракциях, включая jQuery.
Ближайший к тому, что вы ищете в jQuery, использует bind()
(заменено on()
в jQuery 1.7+) или специфичные для события методы jQuery (в данном случае, click()
, который вызывает bind()
внутренне все равно). Все используют фазу барботирования возвышенного события.
Начиная с jQuery 1.7, .on()
является предпочтительным методом привязки событий, а не .bind()
:
С http://api.jquery.com/bind/:
Начиная с jQuery 1.7, метод.on() является предпочтительным методом для прикрепления обработчиков событий к документу. В более ранних версиях метод.bind() используется для присоединения обработчика событий непосредственно к элементам. Обработчики присоединяются к текущим выбранным элементам в объекте jQuery, поэтому эти элементы должны существовать в точке, где происходит вызов.bind(). Для более гибкой привязки событий смотрите обсуждение делегирования событий в.on() или.delegate().
Страница документации находится по адресу http://api.jquery.com/on/
Самая близкая вещь была бы функцией привязки:
$('#foo').bind('click', function() {
alert('User clicked on "foo."');
});
Стоит отметить, что методы событий jQuery не запускаются load
на embed
теги, которые содержат SVG DOM, который загружается как отдельный документ в embed
тег. Единственный способ найти ловушку load
События на них должны были использовать сырой JavaScript.
Это не сработает (я пробовал on
/bind
/load
методы):
$img.on('load', function () {
console.log('FOO!');
});
Тем не менее, это работает:
$img[0].addEventListener('load', function () {
console.log('FOO!');
}, false);
Теперь вы должны использовать .on()
функция для привязки событий.
$( "button" ).on( "click", function(event) {
alert( $( this ).html() );
console.log( event.target );
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<button>test 1</button>
<button>test 2</button>
Вот отличное решение для этой проблемы в Mozilla Development Network (MDN) для стандартного JavaScript (если вы не хотите полагаться на jQuery или лучше его понимаете):
https://developer.mozilla.org/en-US/docs/DOM/element.addEventListener
Вот обсуждение потока событий по ссылке в вышеупомянутой обработке:
http://www.w3.org/TR/DOM-Level-3-Events/
Некоторые ключевые моменты:
- Позволяет добавить более одного обработчика для события
- Это дает вам более детальный контроль фазы, когда слушатель активируется (захват или всплывание)
- Работает на любом элементе DOM, а не только на элементах HTML
- Значение this, передаваемое событию, является не глобальным объектом (окном), а элементом, из которого запускается элемент. Это очень удобно.
- Код для старых браузеров IE прост и включен под заголовком "Legacy Internet Explorer и attachEvent"
- Вы можете включить параметры, если заключите обработчик в анонимную функцию