如何使用jQuery将事件附加到动态HTML元素?

如何使用jQuery将事件附加到动态HTML元素?

假设我有一些jQuery代码,它将事件处理程序附加到具有类的所有元素.myclass

例如:

$(function(){
    $(".myclass").click( function() {
        // do something
    });});

我的HTML可能如下:

<a class="myclass" href="#">test1</a><a class="myclass" href="#">test2</a><a class="myclass" href="#">test3</a>

这没有问题。但是,请考虑.myclass在将来某些时间是否将元素写入页面。

例如:

<a id="anchor1" href="#">create link dynamically</a><script type="text/javascript">$(function(){
    $("#anchor1").click( function() {
        $("#anchor1").append('<a class="myclass" href="#">test4</a>');
    });});</script>

在这种情况下,test4链接是在用户单击时创建的a#anchor1

test4链接没有click()与之关联的处理程序,即使它有class="myclass"

基本上,我想编写click()处理程序一次,并将其应用于页面加载时出现的内容,以及稍后通过AJAX / DHTML引入的内容。知道如何解决这个问题吗?


牛魔王的故事
浏览 767回答 4
4回答

守着星空守着你

有时这样做(最高投票的答案)并不总是足够的:$('body').on('click',&nbsp;'a.myclass',&nbsp;function()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;something});这可能是一个问题,因为触发了订单事件处理程序。如果你发现自己这样做了,但由于它的处理顺序而导致问题。你总是可以将它包装到一个函数中,当被称为“刷新”监听器时。例如:function&nbsp;RefreshSomeEventListener()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Remove&nbsp;handler&nbsp;from&nbsp;existing&nbsp;elements &nbsp;&nbsp;&nbsp;&nbsp;$("#wrapper&nbsp;.specific-selector").off();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Re-add&nbsp;event&nbsp;handler&nbsp;for&nbsp;all&nbsp;matching&nbsp;elements &nbsp;&nbsp;&nbsp;&nbsp;$("#wrapper&nbsp;.specific-selector").on("click",&nbsp;function()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Handle&nbsp;event. &nbsp;&nbsp;&nbsp;&nbsp;}}因为它是一个函数,每当我以这种方式设置我的监听器时,我通常会在文档就绪时调用它:$(document).ready(function()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Other&nbsp;ready&nbsp;commands&nbsp;/&nbsp;code &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Call&nbsp;our&nbsp;function&nbsp;to&nbsp;setup&nbsp;initial&nbsp;listening &nbsp;&nbsp;&nbsp;&nbsp;RefreshSomeEventListener();});然后,每当您添加一些动态添加的元素时,再次调用该方法:function&nbsp;SomeMethodThatAddsElement()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Some&nbsp;code&nbsp;/&nbsp;AJAX&nbsp;/&nbsp;whatever..&nbsp;Adding&nbsp;element&nbsp;dynamically &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Refresh&nbsp;our&nbsp;listener,&nbsp;so&nbsp;the&nbsp;new&nbsp;element&nbsp;is&nbsp;taken&nbsp;into&nbsp;account &nbsp;&nbsp;&nbsp;&nbsp;RefreshSomeEventListener();}希望这有帮助!问候,

泛舟湖上清波郎朗

如果您要向DOM添加一堆锚点,请查看事件委派。这是一个简单的例子:$('#somecontainer').click(function(e)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;var&nbsp;$target&nbsp;=&nbsp;$(e.target);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if&nbsp;($target.hasClass("myclass"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;something &nbsp;&nbsp;}});
打开App,查看更多内容
随时随地看视频慕课网APP