【问题标题】:How to make each fuction work with dynamically added elements? [duplicate]如何使每个函数与动态添加的元素一起工作? [复制]
【发布时间】:2015-12-29 18:26:43
【问题描述】:

我有这个脚本,我想让它与数据库中动态添加的元素一起工作:

$( ".select-song li" ).each(
function( intIndex ){
    $( this ).bind (
        "click",
        function(){
          if($(this).hasClass('checked')){
           $(this).removeClass('checked');
          }
          else{
            $(this).addClass('checked');
          }
        }
        );
}
);

元素是这样添加的:

$('.select-song').append('<li>sth here</li>');

我知道我应该使用 on 函数,但我不知道如何在这里实现它。

【问题讨论】:

标签: javascript jquery click each


【解决方案1】:

使用on() 委托事件:

$(".select-song").on("click", "li", function(){
    $(this).toggleClass('checked');
});

【讨论】:

  • $.toggleClass() 不需要第二个参数。默认情况下它的行为是这样的。
  • @Phylogenesis 确实你是对的,谢谢!
【解决方案2】:

将活动从.select-song 委托给li

$(".select-song").on("click", "li", function () {
    if ($(this).hasClass('checked')) {
        $(this).removeClass('checked');
    } else {
        $(this).addClass('checked');
    }
});

这样每次你在.select-song中追加一个新创建的li,事件就会绑定到它。请记住,最好从最近的非动态父级委托。例如,如果您从 bodydocument 委托,则性能将与必须传播到匹配的选择器之前的事件不同。

【讨论】:

  • If you delegate from body or document for example, the performance will not be the same 对于点击事件真的很重要吗?我的意思是,即使是 Chuck Norris 也无法比浏览器更快地点击。 ;)
  • 是的,这在许多事件一起交互的大型应用程序中确实很重要。
  • 而且应该接收事件的元素是否在 DOM 树中的位置也很重要。
  • 这对于在移除静态容器时清理事件更为重要,例如 imho
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2019-11-21
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2020-03-30
相关资源
最近更新 更多