Подтвердить что ты не робот

Глобальные пользовательские события в jQuery

Я хочу использовать пользовательские события jQuery независимо от элементов DOM, но я не уверен, что лучший способ добиться этого.

Вот что я начал с:

// some system component registers an event handler
$().bind("foo.bar", handler); // foo is my app namespace, bar is event name
// another part of the system fires off the event
$().trigger("foo.bar", { context: "lorem ipsum" });

После просмотра источника jQuery, в частности его обработки глобальных событий AJAX, я решил, что это должно работать:

$.fn.bind("foo.bar", handler);
// ...
$.event.trigger("foo.bar", { context: "lorem ipsum" });

Однако, похоже, что моя функция обработчика даже не называется.

Возможно, я ошибаюсь?

4b9b3361

Ответ 1

Если вы используете jQuery >1.4, то $() возвращает пустую коллекцию jQuery, которая означает, что никакой обработчик событий не привязан ни к чему. До 1.4 он возвращался бы так же, как jQuery(document).

Лучше просто иметь глобальное пространство имен (фактический объект), а затем добавлять к нему события:

var FOO = {};

$(FOO).bind("foo.bar", handler);

$(FOO).trigger("foo.bar", { context: "lorem ipsum" });

Ответ 2

Я нашел свой путь здесь, потому что я искал реализацию шаблона издателя/подписчика с использованием пользовательских событий с именами, использующих jQuery. Хотя принятое решение - это способ использовать $.event.trigger() таким образом, который не привязан к элементам DOM, это не сработает для реальной реализации глобального события в архитектуре издателя/подписчика (например, с помощью сложный интерфейс со многими асинхронными действиями), где вы хотите, чтобы произвольные объекты/элементы выполняли пользовательское событие.

Через эксперименты я обнаружил, что реальный ответ на то, почему события AnC не стреляли, заключается в том, что jQuery, по-видимому, не позволяет "." (период) в пользовательских именах событий... но символы подчеркивания выглядят нормально.

Итак, если вы называете свои события чем-то вроде foo_bar (а не foo.bar), ваш код должен работать должным образом. Протестировано с помощью jQuery 1.4.4.

Изменить: просто чтобы быть ясным - я имею в виду, что для пользовательских событий нельзя использовать периоды, если вы хотите использовать механизм $.event.trigger(). В сценариях, где события запускаются объектами или элементами, периоды кажутся нормальными... не уверены, что это ошибка или по дизайну.