【问题标题】:jQuery binds event multiple times when I'm loading dynamically, how to avoid?jQuery动态加载时多次绑定事件,如何避免?
【发布时间】:2013-04-05 15:36:08
【问题描述】:

我动态加载内容,如下所示:

$.post('main/test', data,function(resp){
    $('#container').html(resp);
});

容器只是<div id="container"></div>

“main/test”有这个脚本:

$('body').on('click','#login-logs',function(e){
  e.preventDefault();
  $('#login-logs-last').toggle();
  $('#login-logs-details').toggle();
});

现在的问题是,我可以多次加载此页面“主/测试”,每次我这样做,事件都会再次绑定。

所以当我第一次加载它并单击#login-logs 时会发生什么,它按预期工作(隐藏#login-logs-last 并显示#login-logs-details),但是当我再次加载页面时,它做的相反,第三次它再次工作,依此类推。

所以问题是,我怎样才能让这个 on('click','#login-logs') 事件只绑定一次,第一次动态加载页面时...?而不是每次我加载页面...

为什么?我希望用户能够来回浏览不同的页面,这意味着“主/测试”页面将被加载多次..

【问题讨论】:

    标签: jquery events dynamic bind


    【解决方案1】:

    您将使用 off() 删除以前的处理程序,然后使用 on() 附加新的处理程序:

    $('body').off('click','#login-logs')
             .on('click','#login-logs',function(e){
                  e.preventDefault();
                  $('#login-logs-last, #login-logs-details').toggle();
    });
    

    【讨论】:

    • 谢谢,正是我需要的。话虽如此,我有很多这样的事件,所以如果有什么东西可以一次“关闭”它们而不是把它添加到每个事件中,那就太好了。
    • $('body').off('click') 可能会删除任何附加到正文的点击处理程序。
    • 我认为这样更简单:$('.edit-btn').off('click').on('click', function () { // #code... });
    • @AbdelalimHassouna - 如果 OP 实际上有一个带有 .edit-btn 类的元素,并且没有使用委托事件......哦等等,那么这根本不是问题所要求的,但它肯定似乎更容易?
    • @adeneo 但问题有#login-logs 基本相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多