如果我的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)
}
});
});
答案 0 :(得分:6)
你的问题是live
没有绑定到任何特定的元素集,它绑定到click事件发生时匹配特定选择器的任何元素。这意味着您无法使用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');
}
});
});
技术演示: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() {
//...
});
您仍然无法使用unbind
或off
来停止此版本的on
(除非在非常狭窄的情况下,例如您只有一个符合{{1}的元素并且您只附加了一个单击处理程序(或者如果您使用命名函数))。如果你使用“实时”样式绑定,你仍然需要类似上面的“添加类作为标志”技巧,如果你绑定到绑定点击处理程序时存在的一组特定元素,那么你应该'如果要使用.el a
,您应该使用live
,bind
或click
之一将处理程序绑定到这些特定元素;然后您可以使用on
或unbind
分离处理程序。或者更好的是,你只需使用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)
使用unbind http://api.jquery.com/unbind/