@bighoc
php/javascript developer

Как в JavaScript первым обработать event?

Скажем есть форма, но я не могу быть увереным на на её евент "submit" уже не существуют обработчики.
Мне нужно быть увереным что именно мой обработчик запуститься первым.
Как я могу этого достичь ?
  • Вопрос задан
  • 224 просмотра
Пригласить эксперта
Ответы на вопрос 2
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Никак, используя ту же фазу (иначе см. ответ evnuh про использование capturing, а не bubbling phase).
И вы этого не должны хотеть.
Ответ написан
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Можно.
В JS эвенты находятся в двух состояниях - capturing и bubbling. Capturing - это первая фаза, когда эвент "углубляется" от корня DOM дерева (< body >) до своего target (элемента, на котором эвент сгенерирован), при этом все хендлеры, забинденные на любой из элементов на этом пути отработают (забиндены должны быть именно на фазу capture). Как только эвент дошёл до цели (< form >, например, если submit event), он меняет фазу на Bubbling. Bubbling - это наоборот, всплытие эвента вверх по дереву к корню DOM (от < form > до < body >). И снова эвент запускает все хендлеры, которые его слушают, только уже на фазе bubbling-a. К слову. в jQuery все эвенты работают только с фазой bubbling. Да и вообще у всей этой системы, как обычно, куча нюансов на разных браузерах, кому интересно - www.quirksmode.org/js/events_order.html

В вашем случае, если хотите, чтобы ваш хендлер отработал раньше всех, этого можно достичь, забиндившись на фазу capture.
Например:
jQuery(form).parent().get(0).addEventListener('submit', submit_handler, true);
// true в третьем параметре как раз и говорит, что бинд на фазе capture, а не bubble

Для пущей уверенности, можно забиндиться не на элемент, а на его родителя (как в моём примере), при этом сверяя target у эвента, что он точно предназначен нужному вам элементу. Это не гарантирует, что вы отработаете первым, ведь какой-нибудь хитрый засранец мог поставить бинд аж на сам < body > на фазе capture, но ситуация крайне редкая, плюс никакие JS библиотеки не работают с capture фазой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы