如果我的 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)
}
});
});
最佳答案
你的问题是 live
没有绑定(bind)到任何特定的元素集,它绑定(bind)到在点击事件发生时匹配特定选择器的任何元素。这意味着您不能使用 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 的评论是正确的,如果您正在使用 jQuery 1.7,则不应再使用 live
,即使在 1.6 中也有些不赞成。您通常最好使用 delegate
1.7 和 on
之前如果您使用的是 1.7:
$(document).on('click', '.el a:not(.been-clicked)', function() {
//...
});
您仍然不能使用unbind
或off
来停止此版本的on
(除非在非常有限的情况下,例如您只有一个匹配 .el a
的元素,并且您只附加了一个点击处理程序(或者如果您使用命名函数)。如果您使用的是“实时”样式绑定(bind),您仍然需要类似于上面的“将类添加为标志”的技巧,如果您绑定(bind)到绑定(bind)点击处理程序时存在的一组特定元素,那么您应该根本不使用 live
,您应该使用 bind
、click
或 on
之一来绑定(bind)仅处理那些特定元素;然后您可以使用 unbind
或 off
来分离处理程序。或者更好,您只需使用 one
让 jQuery 担心分离处理程序。
关于javascript - 如何从元素中分离jquery事件(函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8199053/