当另一个元素悬停时,删除事件侦听器仍然会触发

时间:2016-09-30 14:34:10

标签: javascript jquery jquery-hover

我不确定我是否真的理解它,也许它在第三个参数,[options]设置我不完全理解,但我会直接看到代码。

构建文档后,我想添加事件监听器来处理keyup和keydowns。我把这一切都搞定了,效果很好。

window.addEventListener('keydown', keyinputhandler, false);
window.addEventListener('keyup', keyinputhandler, false);
function keyinputhandler(e) {
//doing stuff with it here
}

当我使用jquery的悬停方法做某事时,问题就出现了。

var someotherelement = $('#someotherelement');
someotherelement.hover(function(){
    window.removeEventListener('keydown', keyinputhandler, false);
    window.removeEventListener('keyup', keyinputhandler, false);
    //for some reason, the events in keyinputhandler keep firing here, why?
    }, function () {
    window.addEventListener('keydown', keyinputhandler, false);
    window.addEventListener('keyup', keyinputhandler, false);
    }
);

在上面的代码中,我包含了一个我想要实现的评论区域。当我悬停特定元素时,我不希望触发其他事件处理程序。当某些元素悬停时,如何禁用keyinputhandler的行为?

1 个答案:

答案 0 :(得分:-1)

你能确保第一个回调正在执行吗? jQuery" hover"函数将第一个回调作为监听器附加到" mouseenter"事件。

也许这会有所帮助(来自http://api.jquery.com/mouseenter/):

  

mouseenter事件在处理事件冒泡的方式上与鼠标悬停不同。如果在此示例中使用鼠标悬停,则当鼠标指针移过Inner元素时,将触发处理程序。这通常是不受欢迎的行为。另一方面,mouseenter事件仅在鼠标进入绑定的元素而不是后代时触发其处理程序。因此,在此示例中,处理程序在鼠标进入外部元素时触发,而不是内部元素。

您正在将侦听器附加到窗口对象。然后,您将另一个侦听器附加到内部元素。我认为这是问题,因为鼠标中心冒泡行为。

你可以尝试一下吗?

$( "#someotherelement" )
    .mouseover(function() {
        window.removeEventListener('keydown', keyinputhandler, false);
        window.removeEventListener('keyup', keyinputhandler, false);
    })
    .mouseout(function() {
        window.addEventListener('keydown', keyinputhandler, false);
        window.addEventListener('keyup', keyinputhandler, false);
});