2014-10-17 30 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