【问题标题】:Elements appeneded not triggering events附加的元素不触发事件
【发布时间】:2013-12-08 18:26:35
【问题描述】:

我有一个清单

<ul id="list">
    <li> element one <span class="remover">X</span></li>
    <li> element two <span class="remover">X</span></li>
</ul>

并且这个列表是动态附加的

<input type="text" id="adder">
<button id="add">Add</button>

<script>
    $("#add").click(function(){
        $("#list").append('<li>'+$("#adder").val()+' <span class="remover">X</span></li>');
    });
</script>

但问题在于这部分

<script> 
    $(".remover").click(function(){
        $(this).parent().remove();
    });
</script>

删除与静态添加的项目完美配合,但是当涉及到新的附加项目时,点击没有任何反应,甚至不会触发该功能

【问题讨论】:

标签: javascript jquery jquery-append


【解决方案1】:

你应该使用

on('click',function(){})

不是

.click()

参考:http://api.jquery.com/on/

因为 click 将与文档中的当前项目相关,而 on 与将添加到文档中的未来项目相关,但是您应该始终使用 on 与文档中已经存在的内容,例如添加的未来的父项元素所以使用类似的东西

$("#parent").children("li").children('.remover').on("click",function(){bla bla bla;});

【讨论】:

  • 嘿,谢谢,但是点击可以工作,但是删除部分对新添加的项目不起作用。
  • 您对使用on 是正确的,但对于如何 使用它是错误的。这不会解决问题。
  • 这会选择#parent,然后将on()绑定的函数绑定到#parent的现有子代,不是动态添加的子代。
  • 您仍然只将处理程序绑定到现有的remover 元素,而不是绑定到父元素
  • @ProllyGeek 你绝对错了,这两个代码 sn-ps 是等价的。第一个选项在运行时直接绑定到按钮;第二个将监听来自按钮的父级点击。继续尝试;你会发现它们是不同的。
【解决方案2】:

我建议:

$('#list').on('click', '.remover', function(e){
    $(this).parent().remove();
});

JS Fiddle demo.

参考资料:

【讨论】:

  • 在这种情况下你仍然可以使用this
  • 当然...由于某种原因,当我从addEventListener()this 是绑定 eventListener 的元素)和 jQuery 切换时,我总是被抓到,它是元素匹配选择器(如果使用了选择器)。编辑/更正;谢谢! :)
【解决方案3】:

在列表中调用 click 函数并将 remover 设置为目标,如下所示:

$( '#list' ).on( 'click', '.remover', function (e) {
    $(e.target).parent().remove();
});

你不能直接在它上面设置点击事件,它必须在从不添加到页面的元素上设置。

【讨论】:

  • 很好的解释,非常感谢,现在我明白了
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 2015-12-30
  • 2010-09-27
  • 2013-09-22
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多