【问题标题】:Using off to unbind query event使用 off 取消绑定查询事件
【发布时间】:2013-01-16 09:21:49
【问题描述】:

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

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

每个函数一旦完成就会调用事件,这样每个人都将等待直到可以运行。

这是代码:

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

【问题讨论】:

  • "this" 可能不是你想的那样。 ;)
  • 而不是 $(document).off('bmadone','#bma-root',this); 尝试 $(document).off('bmadone'); 假设这会起作用
  • 问题在于 $(document).off('bmadone');将删除所有处理程序,我只需要删除一个

标签: javascript jquery javascript-events event-handling


【解决方案1】:

您必须将相同的(子)参数集传递给.off,就像您传递给.on 一样。 IE。在您的情况下,它将是$(document).off('bmadone')

您从未将'#bma-root' 传递给.onthis 引用事件处理程序(您传递给.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();
    }
});

或使用namespaced events

【讨论】:

  • 在off中使用'this'不基本就是函数对象吗?
  • 不,它指的是documentthis 从不引用函数,除非您明确设置它。
  • 我该如何设置呢?我不想仅仅为了在通话结束时调用它而创建一个函数 - 必须有一种方法可以指向当前的匿名函数。
  • 无论哪种方式,您都在创建一个函数。匿名函数也是函数;)。如果您不关心旧 IE 浏览器中的问题,您可以使用命名函数表达式...将更新我的答案。或者你可以使用命名空间事件,正如我已经说过的。
  • 我已经尝试了你的建议,它看起来很棒,我仍然收到多个调用(可能是因为某些函数在它们能够从事件中删除自己(处理程序)之前被调用) . - 也许更好的方法是让一个处理程序来处理所有函数,这样我可以确保每个函数都运行一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多