Jquery событие сочится - PullRequest
       1

Jquery событие сочится

1 голос
/ 06 октября 2011

Могу ли я сделать так, чтобы событие JQuery сбрасывало DOM, а также пузырилось?

Я пытаюсь реализовать событие 'create', которое срабатывает при добавлении узла в dom. Я нашел несколько реализаций, но у всех есть одна общая черта - корень вставленного элемента запускает событие create, но ни одно из его дочерних элементов. Если вариант использования заключается в том, чтобы дать узлу функцию «конструктор», то событие create должно применяться ко всем новым узлам, не так ли?

Например, если я вставлю неупорядоченный список с несколькими элементами списка. Все методы, которые я обнаружил, будут вызывать событие ul create, но ни один из li.

Моя лучшая идея - каким-то образом связать фазу струйки события, чтобы событие начиналось в уль, а они просачивались во все ли.

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

В настоящий момент я также очень заинтересован в вебките, поэтому любое решение не обязательно должно быть безопасным для IE.

Спасибо

@ Dave:

Кто-то исправит меня, если я здесь не прав, но, насколько я понимаю, все события (кроме нескольких в IE) сначала «всплывают» в ваше дерево домов; так от li до ul к телу, затем развернитесь и «стекайте» обратно вниз; от тела к ул, на ли, на которого нажали, и на любого из детей ли.

Вы можете прослушивать события, которые «сочетаются», установив третий параметр addEventListener в значение true в большинстве браузеров (хотя я не думаю, что IE attachEvent имеет такую ​​возможность).

У нас бывают как пузыри, так и струйки в основном потому, что возникла путаница относительно того, как это должно быть сделано еще при рождении Интернета, и w3c только что принял оба в своих спецификациях, чтобы все были довольны, а обратная совместимость хорошая. Со временем ручеек постепенно исчез, потому что в большинстве случаев он довольно бесполезен, поэтому я не думаю, что у jquery есть какие-либо варианты для этого. Мне кажется, что событие «создать» - это один из тех странных случаев, в которых было бы полезно использовать ручеек. Хитрость заключается в том, как интегрировать запуск события create и затем превращать его в jquery таким образом, чтобы сохранить совместимость браузера и API jquery bind () / trigger (), который нам нравится ...

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

Я собираюсь опубликовать ответ здесь вместо обсуждения в комментариях.

Прежде всего, события не проходят ниже цели события. Согласно w3c, событие имеет три фазы: захват , при цели и пузырение . Поэтому, если кто-то щелкает UL, происходит событие:

BODY > DIV > UL (capturing)
UL (at target)
UL > DIV > BODY (bubbling)

(это также выходит за пределы тела). Стоит отметить, что это независимо от того, с каким элементом связано событие . Вы можете привязать событие щелчка к DIV, и событие будет проходить так же. Цель события не обязательно является элементом, который связывает событие (то есть currentTarget).

Как фаза захвата, так и барботирования проходит через один и тот же набор элементов, только в двух разных направлениях . Таким образом, вы можете видеть это больше как заказ обратного вызова.

Если вы связываете обратный вызов с событием с флагом захвата, установленным в «true», это просто означает, что этот обратный вызов будет выполнен перед любыми другими обратными вызовами событий в пузыре.

Итак, если ваше «специальное» событие срабатывает при вставке содержимого DOM, вы можете:

  1. Убедитесь, что событие вспыхнуло
  2. Сделать самый внутренний элемент вставленного DOM целью события

Таким образом, вы можете прослушивать событие из элемента контейнера и при этом убедиться, что все элементы во вставленном DOM являются частью пузыря.

0 голосов
/ 06 октября 2011

jquery делегат сделает свое дело.события связаны со всеми текущими и будущими дочерними узлами.

пример:

$('ul').delegate('li','click',function(){alert("I've been clicked!");});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...