2015-06-22 33 views
-2

驗證碼:事件停止工作後的動態UL李改變

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秒?你是否在等待[加載](https://api.jquery.com/load-event/)? –

+0

你所指的是什麼動態變化?您應用點擊處理程序的元素是否可能已從DOM中刪除? –

回答

2

要綁定的動態HTML事件,你可以按照下面的代碼:

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

}); 

實時例如

$("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'它對我不起作用'並不能真正幫助你弄錯你的問題 –