2013-01-18 41 views
0

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

$(".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()后要翻倍是有什么我失踪?

+0

对不起,这只是示例中的一个错字 –

+0

而您关闭了哪些事件? '.off('click')' –

+0

你的'self'变量来自哪里? –

回答

0

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

+0

切换不适用在这种情况下,我试图删除事件处理程序“单击”,以便它再次调用时不会堆叠。 –

6

这是直接从http://api.jquery.com/off/“关闭()方法去除附着用。对事件处理程序()”。所以如果你在关闭之后绑定一个点击事件,他们将继续执行。我猜你正在重新绑定多次点击事件。

一种解决方案是将事件绑定到父母,只有一次,因此,每当有问题的元素被添加/从dom中删除时,您都不必重新绑定。我知道这可能会带来一些性能方面的问题,但是尽可能地让父母的课程尽可能地深入人心将会对此有所帮助。

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

或者,如果你想重新绑定,你可以使用以下命令:

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

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

0

老了,但只是想出有人仍然会碰到这个运行。如果你打算关闭它,如果没有分配任何东西,它将不起作用。它不会总是触发错误,但会阻止代码正确执行。在页面加载时请确保在事件上添加空白。 $( '#选择')上(); 适用于任何方式。 。

0

这种固定对我来说,增加了空$(..)对();关于文件准备好的方法。

0

有些情况下,你不希望将事件直接绑定到一个元素。相反,您想要将其绑定到父元素,例如“body”。如果你试图在.hover-item它不能正常工作运行.off()

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

这里的问题是:当你想在全球范围定义事件监听器,但该元素尚不存在这是必不可少的。另外,如果你尝试在body使用.off(),用.children()不会做任何事情无论是。

而不是使用.off()的,我相信这是最好的做法,您的活动绑定到一个特定的类名,当你想关闭这些事件,删除类名称:

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

现在,特定元素赢得没有事件监听器了。不过,既然你在技术上定义上body事件侦听器,如果你需要在一段时间后再次启用悬停效果,你可以只使用addClass(".hover-item"),一切都将工作得很好。

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