Ответ 1
Лучшим решением было бы поместить ваш обработчик кликов в отдельную функцию.
Затем вы можете вызвать эту функцию как из обработчика live-клика, так и при необходимости вручную вызвать клик.
У меня интересная ситуация. Мне нужно вызвать живой клик, потому что простой щелчок не работает.
Это то, что у меня есть:
$('.text').trigger('click');
но мне нужно что-то вроде этого:
$('.text').trigger(live('click' ...));
или что-то решить эту проблему.
Это мой код:
$(".Sets a.largeImage").fancybox({
'onComplete': function(){
return errorimage(myurl);
}
});
function errorimage(url) {
$("#fancybox-img").live('click', function(){
$('.lightbox:first').trigger('click');
});
$('#fancybox-img').trigger('click');
}
Идея состоит в том, что я хочу запускать $('.lightbox:first').trigger('click');
, но в режиме live, потому что простой щелчок не работает!
Спасибо!!!!
Лучшим решением было бы поместить ваш обработчик кликов в отдельную функцию.
Затем вы можете вызвать эту функцию как из обработчика live-клика, так и при необходимости вручную вызвать клик.
У меня была та же проблема при использовании Lightbox2, которая связывает событие click с помощью live(). В моем случае решение было инициировать событие следующим образом:
jQuery**('a[rel^="lightbox"]')**.ready(function () {
jQuery("#myimglink").trigger("click");
})
Как вы видите, я запускал событие только после того, как все изображения, которые используют лайтбокс, готовы. Надеюсь, это поможет всем вам - это мой первый вклад в stackoverflow:).
Я предполагаю, что проблема, с которой вы сталкиваетесь, заключается в том, что live()
и delegate()
не привязывают обработчик событий к самому DOM element
/jQuery object
, но в некотором parent node
. live()
, например, привяжет обработчик к document.body
, который проверяет event.target
. Говоря простыми словами, он использует event bubbling
, то есть идею live events
.
Другими словами, используя live, возможно, будет возможно вызвать событие типа
$(document.body).trigger({
type: 'click',
target: $('.text')[0]
});
Обновление
к сожалению, это не работает. Я также попытался установить currentTarget
и relatedTarget
. Где .live()
привязывает обработчик? кто-нибудь?
Поскольку я столкнулся с подобной ситуацией, я нашел решение SLaks совершенно полезным. Однако прикрепление .live("click", handlerFn) и .bind("click", handlerFn) к тем же элементам кажется противоречивым (я не знаю, какие правила приоритета применяются в таком случае). Но он отлично работает, если для триггера используется пользовательское событие вместо "click".
$(".elems").bind("customEvent", handlerFn);
$(".elems").live("click", handlerFn);
$(".elems").trigger("customEvent");
function handlerFn() {
}
Это другой способ, который работает для меня.
$('#test').live('click', function() {
alert("It works!");
});
$('#test')[0].click();
Важная часть здесь:
$('#test')[0].click();
Я верю, что вы можете просто использовать свой первый пример, поскольку триггер используется только для активации связанного элемента, а не для привязки его.
Итак, когда вы это сделаете:
$('#someElement').live('click',function(){./*..*/});
это то же самое, что
$('#someElement').click(function(){./*..*/});
кроме первого, также проверяет новый html на каждый запрос ajax и снова связывается.
так просто:
$('div.class').trigger('click');
и он должен вызывать живые элементы