2015-06-22 3 views
-2

Кодекс:событий перестает работать после того, как динамический уль литий изменения

if($('.info-dropdown').length){ 
     setTimeout(function(){ 
      $('li').has('input[type="checkbox"]').on('click', function(){ 
       $(this).find('.brand-checkbox').parent().toggleClass('active'); 
      }); 
     }, 10); 
    } 

Проблема: Этот код определяет события, нажмите на элемент checkbox. После динамического изменения этого ul li событие перестает работать.

Примечание: Эти флажки из bootstrap выпадающего меню.

+2

Почему вам нужно подождать 0.01 секунд, прежде чем добавить обработчик щелчка? Ожидаете ли вы что-нибудь [load] (https://api.jquery.com/load-event/)? –

+0

Каковы эти динамические изменения, на которые вы ссылаетесь? Возможно ли, что элемент, который вы применили обработчик кликов, был удален из DOM? –

ответ

2

Чтобы связать событие для динамического HTML, Вы можете следовать следующим кодом:

$('containerSelector').on('eventName', 'mainElementSelector' function(e){ 

}); 

Realtime пример

$("ul").on("click", "li:has(:checkbox)", function(){ 

}); 
2

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

Делегированная обработка событий привязывает обработчик события к общему родительскому объекту (который не заменен) и использует тот факт, что многие события вызывают пузырьки родительской цепочки, чтобы обработать событие из общего родителя. Это позволяет свободно создавать или заменять дочерние элементы, но все же имеет один обработчик событий, который работает для всех дочерних объектов.

Вы можете прочитать намного больше о том, как сделать делегированных обработки в этих других ответах событие:

jQuery .live() vs .on() method for adding a click event after loading dynamic html

Does jQuery.on() work for elements that are added after the event handler is created?

JQuery Event Handlers - What's the "Best" method

Как показано в этих ссылочных ответов, общее идея такова:

$("#staticParentSelector").on("click", ".selectorForDynamicChildren", function(e) { 
    // event handler code here 
}); 
+0

Я попробовал также метод 'on'. Это не работает для меня. Я попытался: '$ ('li input [type =" checkbox "]'). On (" click ", function() {...' – Djavad

+1

@Djavad - вам нужно быть более конкретным о том, что вы пробовали и что не сработало, потому что делегированная обработка событий (правильно выполненная с '.on()' отлично работает для динамически создаваемых элементов). Это обычное решение для обработчиков событий для динамически созданных элементов. Другие ответы, на которые я ссылался в мой ответ объясняет, как это сделать должным образом. – jfriend00

+0

@Djavad 'Это не работает для меня' не очень помогает получить то, что вы делаете неправильно. Будьте более конкретным! –

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