2012-06-04 1 views
10

Может ли кто-нибудь сказать мне, почему этот код не работает?jQuery триггер не срабатывает с bind() или on() для пользовательских событий

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

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

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

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

+0

Это просто хорошая проверка здесь, http://jsfiddle.net/joycse06/XXXhQ/ –

+0

Да, ваш синтаксис работает с настраиваемым событием – mprabhat

+0

Нечетный. Все эти примеры работают, но на моей странице это не так. Я только что обновил jQuery с 1.6.4 до 1.7.2 сегодня, возможно, на моем сервере проблема с кешем? Я понимаю, что 'on()' не был реализован до 1.7 – IamFace

ответ

8

Оказывается, проблема заключается в том, что 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, но по какой-то причине только один способ работает на моем сервере. На мой взгляд, возникает вопрос о том, почему, но, по крайней мере, мы можем видеть, что этот код действительно работает, есть какая-то странная аномалия с моими вещами:/

+8

Это потому, что ваш семантически неверный. start() передаст возвращаемое значение вашей функции запуска. В то время как начало передается функция, которая должна быть выполнена, когда документ готов. Как правило, люди передают анонимные функции: $ (function() {/ * my stuff here * /}); – Jeff

+0

@Jeff +1 спасибо – Chris22

+0

Спасибо, это сработало для меня тоже. Добавлен документ, готовый к объявлению «on»! –

1

Try делегация:

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

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

Это работает как в прямом эфире() используется для. http://api.jquery.com/live/

+0

ваш код не отражает то, что хочет OP. Проблема OP не делегируется, но настраивается событие – thecodeparadox

+1

Это настраиваемое событие, и вы правы его код СЛЕДУЕТ работать, я просто знаю по опыту, иногда проще связать события таким образом (даже пользовательские события), а не напрямую. Из документов: обработчики событий привязаны только к выбранным в данный момент элементам; они должны существовать на странице в момент, когда ваш код выполняет вызов .on(). Конечно, тело должно существовать, но что-то странное происходит в их ситуации, которую мы не можем видеть, это преодолеет это. (В теории). ;) – Jeff

Смежные вопросы