JQuery на () документы - PullRequest
       6

JQuery на () документы

4 голосов
/ 06 января 2012

Являются ли документы для jQuery on() неправильными (или неясными)? Рассмотрим этот код:

<div>
    <span>
        <div>
            <input type="button" value="click me!" />
        </div>
    </span>
</div>

$(document).on("click", function() {
    console.log(this.toString());
});

Состояние документов

селектор Строка селектора для фильтрации потомков выбранного элементы, которые запускают событие. Если селектор нулевой или опущен, событие всегда срабатывает, когда достигает выбранного элемента.

Нажатие кнопки вызывает только один console.log для самого документа, в то время как $(document).on("click", "*", function()... вызывает много.

Я знаю, что сообщество Stack Overflow не отвечает за документы jQuery, но не должны ли они сказать, что, если селектор опущен, событие only инициируется, когда оно достигает выбранного элемента? Или я что-то не так понимаю в делегировании событий?

Полная скрипка

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Нет делегирования события, когда вы не используете селектор.Из документов:

Если селектор опущен или равен нулю, обработчик события называется прямым или напрямую связанным.Обработчик вызывается каждый раз, когда происходит событие на выбранных элементах, независимо от того, происходит ли оно непосредственно на элементе или всплывает из дочернего (внутреннего) элемента.

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

В основном .on делает вещь jQuery - она ​​перегружена, чтобы делать совершенно разные вещи в зависимости от аргументов.Лично я предпочитаю .delegate для делегирования и .bind для обычных событий, поскольку они намного понятнее, и я надеюсь, что они не будут удалены в более поздних версиях.

4 голосов
/ 06 января 2012

Лично я думаю, что это достаточно ясно.Когда селектор опущен, событие срабатывает при достижении выбранного элемента.Слово «всегда» на самом деле не меняет смысла.Событие будет всегда запускаться при достижении выбранного элемента (обратите внимание, что если вызывается что-то вроде stopPropagation, событие не достигнет выбранного элемента и, следовательно, не будет запущено).

Когда присутствует селектор, событие запускается, когда оно достигает выбранного элемента, который возник из элемента, соответствующего селектору.

Когда вы используете универсальный селектор * каждый отдельный элемент между целью событияи выбранный элемент вызовет событие.

Как вы указали в своем комментарии, on предоставляет все функции, необходимые для привязки событий в jQuery 1.7 +:

По состоянию наВ jQuery 1.7 метод .on () предоставляет все функции, необходимые для подключения обработчиков событий.

...