10

我正在尝试使用 jquery 的 unbind 函数从窗口对象中删除blur和事件侦听器:focus

function removeWindowEvents(){
    $(window).unbind('blur') ; 
    $(window).unbind('focus') ;
}

我使用 Javascript 注册了该事件:

function addEvents(){
window.addEventListener('blur', function(){ document.title = "Blurred" ; });
window.addEventListener('focus', function(){ document.title = "In Focus" ;}); 


}

然而,这不起作用。我究竟做错了什么?我测试过这是 Mozilaa 和 Chrome(最新版本)

4

2 回答 2

12

你不能按照你的方式去做。

如果原始侦听器是使用 jQuery 配置的,则 jQuery 只能取消绑定给定事件的所有事件处理程序。

这是因为添加的事件addEventListener()必须删除,removeEventListener()并且removeEventListener()需要指定回调函数的第二个参数。

MDN 页面

target.removeEventListener(type, listener[, useCapture])

如果事件最初是使用 jQuery 注册的,那么 jQuery 会通过仅向 addEventListener 注册一个指向它自己的回调函数的主事件来解决这个问题,然后使用它自己的事件调度所有通过 jQuery 注册的事件。这允许它.unbind()像您尝试使用的那样支持泛型,但它仅在原始事件使用 jQuery 注册并因此通过 jQuery 事件处理程序管理系统时才有效。

所以,如果没有 jQuery,你会这样做:

function blurHandler() {
    document.title = "Blurred" ;
}

function focusHandler() {
    document.title = "In Focus" ;
}

function addEvents(){
    window.addEventListener('blur', blurHandler);
    window.addEventListener('focus', focusHandler); 
}

function removeWinowEvents() {
    window.removeEventListener('blur', blurHandler);
    window.removeEventListener('focus', focusHandler);
}

使用 jQuery,您可以这样做:

function addEvents(){
    $(window).on('blur', function(){ document.title = "Blurred" ; })
             .on('focus', function(){ document.title = "In Focus" ;}); 
}

function removeWindowEvents() {
    $(window).off('blur focus');
}
于 2013-09-22T19:10:52.547 回答
0

尝试使用 jquery 进行绑定,请参阅Using JQuery to bind "focus" and "blur" functions for "window", doesn't work in IE

$(function() {
    $(window).focus(function() {
        console.log('Focus');
    });

    $(window).blur(function() {
        console.log('Blur');
    });
});
于 2013-09-22T19:11:09.920 回答