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

Javascript 如何从元素中分离jquery事件(函数),javascript,jquery,events,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?

如果我的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)
      }
    });
  });
我想你想要:

.unbind("click");
或者在jQuery1.7中+

.off("click");
注意:这将从单击的元素中删除
click
事件;如果要阻止新创建的元素发生单击事件(即禁用
live()
方法),则需要执行以下操作:

$('.el a').die("click");
使用unbind

这可以通过使用
.unbind()
来完成,但不能从ajax类的success函数内部使用
,因为它将引用来自函数回调的不同对象,然后是您单击的元素,而是创建一个存储单击的元素的变量;在本例中,我使用了
elem
,并使用它在成功时解除单击事件的绑定
$(elem)


Edit:@mu太短了,在1.7之前的早期版本中,它明显地指出,杀死.live()设置的事件比杀死.live()设置的事件要困难得多,他的示例您的问题是
live
不绑定到任何特定的元素集,在单击事件发生时,它绑定到与特定选择器匹配的任何元素。这意味着您不能使用
unbind
off
来阻止单击触发处理程序

但是,您可以稍微修改选择器以排除具有特定类的元素,然后添加该类以告知
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');
    }
  });
});
技术演示:


Greg Pettit的评论是正确的,如果您使用的是jQuery1.7,甚至在1.6中也有点不赞成,那么就不应该再使用
live
。您通常最好使用1.7之前的版本,如果您使用的是1.7:

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

您仍然无法使用
解除绑定
关闭
上停止此版本的
(除非在非常狭窄的情况下,例如您只有一个与
.el a
匹配的元素,并且仅附加了一个单击处理程序(或者如果您使用命名函数))。如果您使用的是“实时”样式的绑定,那么您仍然需要上面的“将类添加为标志”技巧,如果您绑定到在绑定单击处理程序时存在的一组特定元素,那么您根本不应该使用
live
,您应该使用
bind
click
中的一个,或者
on
将处理程序绑定到那些特定元素;然后可以使用
unbind
off
分离处理程序。或者更好,您可以使用jQuery,让jQuery担心如何分离处理程序。

OK只是删除了$(this)部分以避免混淆,而不是“单击”,您可以添加名称空间(看起来像类选择器),例如“click.my”。然后,可以对元素调用
.unbind('click.mine')
以解除单个事件的绑定,或对所有事件调用
.unbind('.mine')
.live
方法现在或将来将绑定到与选择器匹配的所有元素。你是想从点击的特定元素中分离事件,还是从现在和将来的所有(其他)匹配元素中分离事件?噢,我现在和你在一起,穆。有一阵子我没有想到。即使使用相同的技术,我也会使用
.on()
(如果她使用的是1.7+)或
.delegate()
)为Alex提供代码。@Greg:我不知道HTML是什么样子,所以我不能使用
delegate
。不过,我已经为其他情况添加了一些提示。这当然会让它变得困难。很高兴看到你更新的帖子。但愿我能投两次票我通常用$(‘some祖先’)和一个简短的解释。对
one
的调用也很好;我没想到这个。(呻吟)
$(document).on('click', '.el a:not(.been-clicked)', function() {
  //...
});