Триггер jQuery не срабатывает с помощью bind() или on() для пользовательских событий

Может ли кто-нибудь сказать мне, почему этот код не будет работать?

$('body').on('test', function() {
  alert('test');
});

$('body').trigger('test');

Я использую jquery-1.7.2.min. Я не получаю никаких ошибок, просто ничего не происходит.

Я пытался поместить код во встроенный скрипт, внутри $(document).ready() и все равно ничего. Я также пробовал и on(), и bind(), и ни одного результата. Я вижу примеры повсюду, показывающие один и тот же синтаксис, так что же в этом отличается?


person IamFace    schedule 04.06.2012    source источник
comment
Здесь все работает нормально, jsfiddle.net/joycse06/XXXhQ   -  person Prasenjit Kumar Nag    schedule 04.06.2012
comment
да, ваш синтаксис работает с пользовательским событием   -  person mprabhat    schedule 04.06.2012
comment
Странно... Все эти примеры работают, но не на моей странице. Я только что обновил свой jQuery с 1.6.4 до 1.7.2 сегодня утром, может быть, на моем сервере проблема с кешем? Я понимаю, что on() не было реализовано до версии 1.7.   -  person IamFace    schedule 04.06.2012
comment
оповещение (jQuery.fn.jquery); проверит вашу версию или предупредит (typeof jQuery.fn.on); для подтверждения существования функции.   -  person Jeff    schedule 04.06.2012
comment
Я добавлю для моего экземпляра, убедитесь, что вы не включили jquery дважды (объект jquery при регистрации .on должен быть одним и тем же объектом jquery (т. в значительной степени стереть исходные обратные вызовы, которые были установлены при использовании первого объекта $ jquery. Старый/исходный объект jquery будет удален, а новый ($) займет место первого (и прослушиватели событий исчезнут)   -  person Coty Embry    schedule 22.03.2018


Ответы (2)


Похоже, проблема заключается в том, что DOM каким-то образом готов. Размещение кода во встроенном скрипте не сработает. Размещение его внутри $(document).ready() будет работать с анонимной функцией, но по какой-то причине не с вызовом функции с '()'. Этот код работал

$(document).ready(start);
function start(){
$('body').on('test', function() {
  alert('test');
});

$('body').trigger('test');
}

Но это не... *обратите внимание на круглые скобки вызова функции.

$(document).ready(start());
function start(){
$('body').on('test', function() {
  alert('test');
});

$('body').trigger('test');
}

Точный пример работает в обоих направлениях на jsfiddle, но по какой-то причине на моем сервере работает только один способ. Что, я думаю, вызывает еще один вопрос, почему, но, по крайней мере, мы можем видеть, что этот код действительно работает, с моими вещами есть какая-то странная аномалия :/

person IamFace    schedule 04.06.2012
comment
Это потому, что вы семантически неверны. start() передаст возвращаемое значение вашей стартовой функции. В то время как start передаст функцию, которая будет выполнена, когда документ будет готов. Обычно люди передают анонимные функции: $(function() {/*мои вещи здесь*/}); - person Jeff; 04.06.2012
comment
Спасибо, это сработало и для меня. Добавление готового документа по декларации сработало! - person rf_wilson; 11.07.2013

Попробуйте делегирование:

$(document).on('test', 'body', function() {
  alert('test');
});

$('body').trigger('test');

Это работает так же, как и live(). http://api.jquery.com/live/

person Jeff    schedule 04.06.2012
comment
ваш код не отражает то, что хочет OP. Проблема OP не в делегате, а в пользовательском событии - person thecodeparadox; 04.06.2012
comment
Это настраиваемое событие, и вы правы, его код ДОЛЖЕН работать, я просто знаю по опыту, что иногда проще связать события таким образом (даже настраиваемые события), чем прямое связывание. Из документов: обработчики событий привязаны только к выбранным в данный момент элементам; они должны существовать на странице в момент, когда ваш код вызывает .on(). Конечно, тело должно существовать, но в их ситуации происходит что-то странное, чего мы не можем видеть, это преодолело бы это. (Теоретически). ;) - person Jeff; 04.06.2012