2015-01-14 76 views
2

不能存取權限動態生成的元素: 這是我的JSON請求功能:不能訪問動態生成的元素

$.getJSON('/getJSON.php?selectorcat='+var1, function(jsonData){ 

var LI_list_html = ''; 
var sum = 0; 

if(jsonData[0]) 
    { 
     $.each(jsonData, function(i,value) 
     { 
     var catname = jsonData[i].name; 
     var id = jsonData[i].id; 
     var DIV_html = catname; 

     LI_list_html = LI_list_html+'<li class="selectorsub" data-catselectsub="'+id+'" id="SelectorSubcat_'+id+'">'+DIV_html+'</li>'; 
     }); 
     } 
     else 
     { 
      LI_list_html = 'No subcats there..'; 
     } 

所以,當我得到生成的HTML這樣的:

<ul> 
    <li class="selectorsub" data-catselectsub="169" id="SelectorSubcat_169">CAT1</li> 
    <li class="selectorsub" data-catselectsub="170" id="SelectorSubcat_170">CAT2</li> 
    <li class="selectorsub" data-catselectsub="171" id="SelectorSubcat_171">CAT3</li> 
    <li class="selectorsub" data-catselectsub="172" id="SelectorSubcat_172">CAT4</li> 
</ul> 

我無法存取權限鋰元素trought這樣的:

$("[id^=SelectorSubcat_]").click(function() { 
    alert($(this).data('catselectsub')); 
}); 

我想的Elemen是生成沒有準備好的DOM,這是爲什麼無法訪問它們。

+0

對於這個原因,你是100%真實的,這就是爲什麼我們有[委託事件](http://learn.jquery.com/events/event-delegation/)。順便說一下,你的jQuery選擇器非常複雜,在這種情況下,你最好使用我所看到的類。 –

+1

爲什麼不依賴'.selectorsub'類而不是'[id^=]'?它不僅更簡潔,而且性能更好。 – haim770

回答

8

事件處理程序僅綁定到當前選定的元素;它們必須在代碼進行事件綁定調用時存在於頁面上。

當您動態創建元素時,您需要使用Event Delegation使用.on()委派事件方法。

$(document).on('event','selector',callback_function) 

$(document).on('click', "[id^=SelectorSubcat_]", function(){ 
    //Your code 
}); 

在地方的document你應該用最接近的靜態容器更好的性能。

+2

將這種事件委託給文檔是一種不好的做法。出於性能原因,應將事件委派給最近的靜態父級。看到你的聲譽你可能知道,但我認爲它應該是你答案的一部分。 –