2014-10-17 27 views
0

我使用dust.js(經過大量搜索缺乏良好的文檔)。最後,我能夠動態地創建一個超鏈接。現在我想給動態生成的超鏈接提供一個onclick功能。jQuery的點擊不會觸發,當我直接訪問它通過ID

function createLink(){ 

    // register the template loading method with dust now 
    var compiled = dust.compile("Hello <a href='#' id='linked'>{name}</a>!", "intro"); 
    dust.loadSource(compiled); 

    dust.render("intro", {name: "Fred"}, function(err, out) { 
     console.log(out); 
     $("#displayHelloSection").html(out); 
    }); 

} 

下面是我的文檔準備好了。奇怪的是,當我點擊生成的超鏈接時,我得到蘋果,但不是橙色。我很想知道爲什麼第二個onclick不起作用?不同的是,在第一個中,我使用文檔來引用我的id('#linked')。在第二個中我直接訪問了id。這樣的規定

$(document).ready(function() { 


    $(document).on('click','#linked',function(e){ 

    alert("Apple"); 

    }); 

    $('#linked').on('click', function() { 

     alert('Orange'); 

    }); 

}); 

回答

3

事件處理程序:

$('#linked').on('click', function() { 

嘗試在此代碼運行時自身附着到"#linked"對象。如果該對象在該行代碼運行時不存在,則不會創建事件處理程序。

事件處理程序是這樣的:

$(document).on('click','#linked',function(e){ 

委派事件處理程序。事件處理程序附加到document元素,該元素始終存在,因此可以隨時連接。然後,它依靠事件傳播來處理實際上源自其他元素的事件,以便將該元素冒泡到document元素,並且當事件處理程序看到該事件時,它會查看它發起的元素是否匹配"#linked"。這允許"#linked"內容來來去去或稍後創建,而不會影響事件處理程序。


所以,隨着您要在事件處理動態插入的內容打交道時,你有幾個選擇:

  1. 您可以插入內容到DOM中,然後安裝事件處理程序。
  2. 您可以使用委託事件處理將事件處理程序附加到靜態父對象,並使用委託形式.on()來指定您希望它動態查找的子選擇器。

你可以閱讀有關這個​​主題的這些其他職位對委託事件處理的詳細信息:

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

Why not take Javascript event delegation to the extreme?

+0

而且這可以解釋爲什麼警惕母鹿不工作。爲了讓警報正常工作,您可能需要在dust.render中附加「apple」警報。 – 2014-10-17 01:49:19

+0

@ E.Maggini - 我爲OP添加了幾個選項來回答我的問題。 – jfriend00 2014-10-17 01:52:14

+0

委派的活動!我會選擇2.接受答案。 – cherit 2014-10-17 01:54:22