С помощью.on() и e.stopPropagation() на динамических элементах
я экспериментировал с захватом событий щелчка вне элементов, используя stopPropagation()
.
$(".container").children().on('click',function(e){
e.stopPropagation();
});
$(".container").on("click",function(){
alert("outside the box?");
})
вот jsfiddle настроен, чтобы продемонстрировать его функционирование. Предупреждение должно срабатывать при нажатии в любом месте за пределами белого поля.
Теперь я пытаюсь применить тот же принцип к динамически созданным элементам. Насколько я понимаю,on()
метод назначения событий в jQuery должен позволить этому функционировать без изменения сценарий.
вот второй jsFiddle где вы должны сначала щелкнуть ссылку, чтобы создать элементы. Как только вы это сделаете, теория заключается в том, что один и тот же сценарий будет работать, но это не так. Что мне не хватает в этом методе?
5 ответов
короче говоря, вам нужно поставить on()
на существующем родительском элементе, чтобы он работал:
$('body').on('click', 'a', function(e){
e.preventDefault();
$('<div class="container"><div class="box"></div></div>').appendTo('body');
$(this).remove();
});
$('body').on('click', '.container > *', function(e){
e.stopPropagation();
});
$('body').on('click', '.container', function(){
alert("outside the box?");
})
код:http://jsfiddle.net/GsLtN/5/
для более подробной проверки '.on ()' на официальном сайте в разделе 'прямые и делегированные события'
когда элемент добавляется динамически, вы должны прикрепить обработчик к ближайшему родителю, который наверняка будет там - в вашем случае это body
. Вы можете использовать on()
этот способ достижения функциональности это delegate()
используется:
$(селектор-для-родителей).on (событий, селектор-для-динамический-детей, проводник);
таким образом, ваш код будет переписан просто так:
$("body").on('click', '.container', function(e){
var $target = $(e.target);
if ($target.hasClass('container')) {
alert("outside the box!");
}
});
Я e.target
чтобы найти, какой элемент вызвал событие. В этом случае я идентифицирую элемент, проверяя, имеет ли он container
класса.
при привязке обработчика событий к элементу используйте .on
целевая привязка должна существовать в domcument.
$('body').on('click', '.container > *', function(e){
e.stopPropagation();
});
$('body').on("click",'.container',function(){
alert("outside the box?");
})
вам нужно связать .on()
для родителей.
то, что вы пытаетесь сделать, - привязать обработчик к родителю, который слушает событие, а затем проверяет, было ли событие вызвано элементом, который соответствует этому селектору.
$("body").on("click", '.container',function(){
alert("outside the box?");
})
обновленный скрипку здесь
согласно документации для jQuery.on()
:
обработчики событий привязаны только к выбранным элементам; они должен существовать на странице в то время, когда ваш код делает вызов
.on()
.
вы должны привязать событие к родительскому контейнеру. Возможно, что-то вроде этой.