如何从元素中分离jquery事件(函数)

时间:2011-11-20 02:40:04

标签: javascript jquery events

如果我的ajax请求成功,我想删除此点击事件:

  $('.el a').live('click', function(event){
    event.preventDefault();

    $.ajax({
      url: $(this).attr('href'),
      type: 'GET',      
      success: function(response){

         // how to detach this function here? (the live click event)
      }
    });
  });

4 个答案:

答案 0 :(得分:6)

你的问题是live没有绑定到任何特定的元素集,它绑定到click事件发生时匹配特定选择器的任何元素。这意味着您无法使用unbindoff来阻止点击触发处理程序。

但是,您可以稍微修改您的选择器以排除具有某个类的元素,然后添加该类以告知live忽略您的元素:

$('.el a:not(.been-clicked)').live('click', function(event){
  event.preventDefault();

  var $this = $(this);
  $.ajax({
    url: $this.attr('href'),
    type: 'GET',      
    success: function(response){
      $this.addClass('been-clicked');
    }
  });
});

技术演示:http://jsfiddle.net/ambiguous/Deh5j/


Greg Pettit在评论中是正确的live如果你使用jQuery 1.7就不应该再使用了,即使在1.6中也有点不赞成。如果使用1.7,通常最好在1.7和delegate之前使用on

$(document).on('click', '.el a:not(.been-clicked)', function() {
  //...
});

您仍然无法使用unbindoff来停止此版本的on(除非在非常狭窄的情况下,例如您只有一个符合{{1}的元素并且您只附加了一个单击处理程序(或者如果您使用命名函数))。如果你使用“实时”样式绑定,你仍然需要类似上面的“添加类作为标志”技巧,如果你绑定到绑定点击处理程序时存在的一组特定元素,那么你应该'如果要使用.el a,您应该使用livebindclick之一将处理程序绑定到这些特定元素;然后您可以使用onunbind分离处理程序。或者更好的是,你只需使用one并让jQuery担心分离处理程序。

答案 1 :(得分:2)

我想你想要:

.unbind("click");

或jQuery 1.7 +

.off("click");

注意:这将从点击的元素中删除click事件;如果你想阻止新创建的元素发生点击事件(即禁用live()方法),你会想要这样做:

$('.el a').die("click");

答案 2 :(得分:1)

这可以通过使用.unbind()来完成,但你不能在ajax类的success函数中使用this,因为它将引用一个不同的对象来从函数回调然后单击您单击的元素,而不是创建一个存储单击的元素的变量;我在这种情况下使用elem并使用它来解除成功点击事件$(elem).unbind('click');

$('.el a').live('click', function(event){
    event.preventDefault();
    var elem = this;

    $.ajax({
        url: $(this).attr('href'),
        type: 'GET',      
        success: function(response){
            $(elem).unbind('click');
        }
    });
});

编辑:@mu太短了,在1.7之前的版本中已经明显指出它更难以杀死由.live()和他的例子设置的事件

答案 3 :(得分:0)