Извлечение .live () функциональности из jQuery - PullRequest
1 голос
/ 16 января 2011

Я пишу надстройку Firefox, которая в настоящее время зависит от jQuery для следующих вещей:

  • селекторы
  • Анимация
  • Специальный .live ("focus") маневр для захвата событий, который случается с jQuery 1.4.2 (но не 1.4.4)

jQuery не очень подходит для работы внутри XUL, и это чудо, что мы достигли такого уровня. Мы пытаемся удалить требования jQuery, первые два просты (анимации просты, и мы можем использовать .querySelector () вместо jQuery), но .live оказалось невозможным сделать самостоятельно. Я пытался прочитать исходный код, но я не смог его разобрать.

Что делает функция jQuery .live? Очевидно, что происходит гораздо больше, чем document.addEventListener ("focus" / "focusin", function_to_pick_apart_events). Что еще здесь происходит?

Ответы [ 3 ]

0 голосов
/ 16 января 2011

Как уже говорили, использование JQuery в аддоне Firefox может быть не таким безнадежным, как кажетсяНо чтобы ответить на ваш вопрос напрямую: JQuery с открытым исходным кодом, так что вы всегда можете посмотреть сами.Я сам не знаком с исходным кодом JQuery, но думаю, что https://github.com/jquery/jquery/blob/master/src/event.js#L552 может быть хорошим началом

0 голосов
/ 23 января 2011

Один из подходов может заключаться в том, чтобы захватывать события фокуса на уровне окна, а затем перебирать элементы, представляющие интерес, которые могут не иметь прослушивателя события фокуса, и добавлять их. Упрощенный пример:

<script>
function handleFocus(event) {
  event.target.value = "";
}
function captureFocus() {
  document.getElementById("target").onfocus = handleFocus;
}
window.onload = function() {
  addEventListener("focus", captureFocus, true);
}
</script>
<input id="target" value="Enter the value">

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

0 голосов
/ 16 января 2011

Вы используете JQuery в режиме noConflict? У меня есть несколько коллег, которые клянутся JQuery в дополнениях Firefox. Я видел их работу, и результат, и код, и это фантастика. Я предлагаю режим noConflict и использую jQuery для ссылки на JQuery вместо символа $.

.live отличается от .bind. На самом деле, жить довольно удивительно. Он не только связывает обработчики событий с элементами, соответствующими определенному селектору CSS, но также привязывает обработчик к любым новым элементам, которые импортируются на страницу, соответствующую этому селектору. Очевидно, что должен быть какой-то мониторинг, чтобы продолжать связывать события с новыми элементами, EDIT : например, делегирование событий, описанное в комментариях ниже.

Учитывая, что XUL имеет структуру, отличную от HTML DOM, это может объяснить, почему у вас проблемы с .live.

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

...