2012-11-13 50 views
0

我的印象是,jquery的on()(通過AJAX或克隆等)反應以附動態添加到DOM元素事件下。但是,以下內容僅適用於頁面加載時連接到dom的元素。我使用clone()的另一個副本沒有被處理。jquery的上不發生反應()所克隆的添加元素

$(document).ready(function() { 
    $('.ship_via_dropdown').on('change', function() { 
     console.log($(this)); 
     if ($(this).hasClass('prev_change')) { 
      console.log('has'); 
     } else { 
      $(this).addClass('prev_change'); 
      console.log('hasn\'t'); 
     } 
    }); 
}); 

代碼克隆:

$(document).ready(function(){ 
    var form1 = $('.line_item_wrapper').children().clone(); 
    $('#new_line_content_1').html(form1); 
}); 

HTML的下拉列表(的jQuery DB查詢文件上加準備內容)

<span class="select ship_via_select_container"> 
    <select class="ship_via_dropdown ship_via_dropdown_1"> 
    </select> 
</span> 

謝謝你的任何見解!

+0

小心分享您在哪裏做克隆? –

+0

@Adrian是的!給我兩秒鐘。 – 1252748

+0

您是否閱讀過文檔? http://api.jquery.com/on/ – David

回答

3

它的確如此,但不符合您的想法。當作爲你使用它:

$('.ship_via_dropdown').on('change', 

這真的不是比使用.change()不同。你在找什麼是event delegation。此採用以下形式:

$("<selector to static ancestor>").on('change', '.ship_via_dropdown', function() { 

<selector to static ancestor>是一個選擇器,該動態添加元素的靜態祖先。 (一個不是動態創建的)作爲最後的手段document可以在這裏使用。然而對於性能來說,這應該是最接近靜態的祖先元素。

6

委託授權的情況下,而不是:

$(document).on('change', '.ship_via_dropdown', function() { 
    console.log($(this)); 
    if ($(this).hasClass('prev_change')) { 
     console.log('has'); 
    } else { 
     $(this).addClass('prev_change'); 
     console.log('hasn\'t'); 
    } 
}); 

或者更好的是,使用.clone(true)與事件克隆。 (注:這一點,如果你克隆後的事件處理程序連接纔有效。)

+0

+1爲克隆(真)' –

+1

請注意,委託給文件並不總是性能的最佳選擇,通常建議委託給最接近的公共改爲祖先。 – David

+1

只有在更合適的祖先元素不可用時才應使用「文檔」。 –

1

改變這一行:

$('.ship_via_dropdown').on('change', function() { 

這樣:

$(document).on('change',".ship_via_dropdown", function() { 
+0

這是否需要與$(document)結合使用。準備好了嗎?或者簡單的$(文檔)與on()結合起來處理這個問題。非常感謝你。 – 1252748

+0

@thomas是的,當然有。我只是提出了一個快速替代品 –

+0

我明白了。它似乎沒有'$(document).ready()'工作,所以我只是檢查。再次感謝! – 1252748