0

我在这里做错了什么?我阅读了文档,但我似乎无法弄清楚为什么这不能按预期工作。

    $(".img-edit-button").on("click", function () {
       if(self.elementMenuOpen === false){
           self.showImageMenu();
           self.elementMenuOpen = true;
       }else{
           self.hideImageMenu();
           self.elementMenuOpen = false;
       }
});

然后,我用off()

$(".img-edit-button").off();

但是即使在使用之后,事件似乎也加倍了,.off()我错过了什么吗?

4

5 回答 5

6

这直接来自http://api.jquery.com/off/ “off() 方法删除了附加到 .on() 的事件处理程序”。所以如果你在 off 被调用后绑定一个 click 事件,它们会继续被执行。我猜你是多次重新绑定到点击事件。

一种解决方案是将事件绑定到父级,仅一次,因此您不必每次从 dom 添加/删除相关元素时都重新绑定。我知道这可能会有一些性能问题,但是让你的父类尽可能深入 dom 将有助于解决这个问题。

$(".someparentclass").on('click','.img-edit-button',function(){});

或者,如果您想重新绑定,您可以使用以下内容:

$(".img-edit-button").off().on(function(){}); 

http://jsfiddle.net/SEndX/3/

于 2013-01-18T20:37:50.543 回答
0

您可以尝试使用一些“切换”功能来显示和隐藏菜单。您可以在此处找到选项。

于 2013-01-18T20:26:35.640 回答
0

老但只是想有人可能仍然会遇到这个。如果你要取消它,那么如果没有分配任何内容,它就不起作用。它不会总是触发错误,但会阻止代码正确执行。在页面加载时,请确保在事件中添加空白。$('#selector').on(); 以任何方式为我工作。

于 2015-05-20T21:49:12.700 回答
0

这为我修复了它,添加了空的 $(..).on(); 关于文档就绪方法。

于 2015-06-15T19:29:37.110 回答
0

在某些情况下,您不想将事件直接绑定到元素。相反,您希望将其绑定到父元素,例如“body”。当您想要全局定义事件侦听器但该元素可能尚不存在时,这是必不可少的:

$("body").on("mouseenter", ".hover-item", function() {
    // do the thing
}

这里的问题是,如果您尝试在其上运行.off().hover-item不起作用。或者,如果您尝试使用.off()on body, using.children()也不会做任何事情。

.off()我认为最好将事件绑定到特定的类名,而不是使用,当你想禁用这些事件时,删除类名:

$(".the-element").removeClass(".hover-item");

现在该特定元素将不再启用事件侦听器。但是,由于您在技术上定义了事件监听body器,如果您需要稍后再次启用悬停效果,您可以使用addClass(".hover-item"),一切都会正常工作。

现在,这仅适用于您为多个项目设置一个动画的情况。悬停事件就是一个很好的例子。例如,您可以将相同的事件应用于所有按钮,而不是将不同的悬停事件应用于不同的按钮。但是,如果您只想禁用某个特定按钮的悬停事件,那么这是可行的方法。

于 2016-06-06T05:58:03.537 回答