使用off取消绑定查询事件

时间:2013-01-16 09:21:49

标签: javascript jquery javascript-events event-handling

我尝试在我正在处理的项目中为异步调用中的订购问题创建一个简单的解决方案。

我找到的最佳解决方案是: 我附加了一个事件,检查是否完成了预先要求,如果是,我删除事件监听器并执行该功能。

每个函数在完成后调用该事件,这样每个人都会等到可以运行。

这是代码:

$(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的真正新手以及所有这些客户端开发,所以我想我可能会遗漏一些基本的东西。

1 个答案:

答案 0 :(得分:0)

您必须将相同的(子)参数集传递给传递给.off的{​​{1}}。即在你的情况下,它将是.on

您从未将$(document).off('bmadone')传递给'#bma-root',而.on 引用事件处理程序(您传递给this的函数),所以通过传递那些你不会删除正确的事件处理程序。


如果只需要删除该特定处理程序,则可以改为使用命名函数:

.on

或使用namespaced events