![](/img/trans.png)
[英]Remove and Add scroll event handler using jQuery .off or .unbind
[英]Using off to unbind query event
我尝试创建一个简单的解决方案来解决我正在处理的项目中的异步调用中的问题。
我发现的最佳解决方案是:我附加一个事件,检查是否满足了先决条件,如果是,则删除事件侦听器并执行功能。
每个函数在完成事件后都会调用该事件,这样每个人都将等到可以运行该事件。
这是代码:
$(function() {
$(document).on('bmadone',function() {
if(beepmeapp.done_arr['fb-init']){
$(document).off('bmadone','#bma-root',this);
getBMAUserRoutes();
}
});
});
该功能(用于测试)正在执行以下操作:
function getBMAUserRoutes(){
$.ajax({
url : '/bma/users/fb',
type : 'GET',
data : {
access_token: 'abc'
},
success : function( data ) {
console.log('getBMAUser: success');
beepmeapp.done_arr['user-init'] = true;
$('#bma-root').trigger('bmadone');
},
error : function( xhr, err ) {
console.log('getBMAUser: error');
}
});
}
它工作的很好,但我的问题是它陷入了一个永无止境的循环中。 不知道为什么,但是看起来像:
$(document).off('bmadone','#bma-root',this);
不删除监听器...
我是JS / Jquery和所有这些客户端开发中的真正新手,所以我想我可能缺少一些基本知识。
你必须传递的参数相同(子)集.off
,你传递给.on
。 即在您的情况下它将是$(document).off('bmadone')
。
您从未将'#bma-root'
传递给.on
, this
也没有引用事件处理程序(传递给.on
的函数),因此,传递这些内容将不会删除正确的事件处理程序。
如果只需要删除该特定处理程序,则可以使用命名函数:
function handler() {
if(beepmeapp.done_arr['fb-init']){
$(document).off('bmadone', handler);
getBMAUserRoutes();
}
}
$(document).on('bmadone', handler);
// or as a named function expression
$(document).on('bmadone', function handler() {
if(beepmeapp.done_arr['fb-init']){
$(document).off('bmadone', handler);
getBMAUserRoutes();
}
});
或使用命名空间事件 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.