2013-04-11 80 views
0

我的简单脚本通过jquery添加了一些元素。
即时消息试图做的是为这些创建的元素添加一些Ajax调用。
问题是事件从来没有为这些元素工作,我尝试了很多Jquery方法,但都失败了。
使用jquery dyanmic创建的元素?

$("#currentbuild").append('<li class="cancelevent"></li>'); 
$('.cancelevent').bind("click",function(e) { 
         var eventid = $(this).attr('id'); 
         e.preventDefault(); 
         alert(eventid); 
       }) 

还我试图

$("#currentbuild").append('<li class="cancelevent"></li>'); 
$('.cancelevent').on("click",function(e) { 
         var eventid = $(this).attr('id'); 
         e.preventDefault(); 
         alert(eventid); 
       }) 

但它从来没有出现什么

+0

需要委托.on,有人会很快给你代码,我得下班 – Huangism 2013-04-11 21:04:24

回答

1

你几乎正确的:

$("#currentbuild").append('<li class="cancelevent"></li>'); 
$('#currentbuild').on("click",".cancelevent",function(e) { 
    var eventid = $(this).attr('id'); 
    e.preventDefault(); 
    alert(eventid); 
}); 

这增加了click处理程序#currentbuild(其不是动态的,因此总是在DOM中)。但是,它不仅仅会响应点击自身,而只会听取自身内部的点击,而只听取类别为cancelevent的元素。而且,由于您不会将点击处理程序添加到可以动态添加和/或删除的元素,处理程序将始终存在。

编辑:@tcovo在下面的评论中指出,你的代码应该像你在这里发布一样工作。我认为这不完全是你的代码,并且append是由另一个事件处理程序动态发生的(而不是像你在示例中建议的那样在页面加载时)。

此外,var eventid = $(this).attr('id');不会在你的榜样工作,要么,因为在<li>没有id属性...我认为这另一个原因是不是正在给你的麻烦确切的代码。 :)

+1

史蒂夫是正确的。 Live过去与整个文档相关,但是范围仅限于你的语法中与它相关的元素。通过手动插入或AJAX将东西添加到DOM中的位置,您必须退出到要更改/插入的元素的外壳容器,并将其用作选择器的基础。 – 2013-04-11 21:06:38

+0

为什么我们需要在这种情况下委托事件?在'.append'被调用之后,DOM中不应该存在'$('。cancelevent')'? – tcovo 2013-04-11 21:09:39

+0

@tcovo - 我同意,在这种情况下,它应该工作。我假设这不是OP正在使用的确切结构,并且附加地在某处动态地发生。 – Steve 2013-04-11 21:10:49