2012-09-29 59 views
-1

可能重复:
JQuery Unbind and then bindjQuery的解除绑定并重新绑定悬停功能

我有悬停(的mouseenter,鼠标离开)执行的动画的功能。我试图解开功能(因为我不希望用户与它交互),我点击一个按钮后。这有效,但我遇到的问题是重新绑定悬停功能,以便当用户再次单击该按钮时,动画和悬停效果将重新使用。

不知道这是否是正确的方式来实现这一点,但希望我可以得到一些关于这个问题的帮助。谢谢。

+0

你想设置一个阻塞变量和det点击'按钮'切换'hover'。我会建议'$('#theElement')。data('inHover',true)'。或者,也可以使用类名和'if($('#theElement')。is('。hoverable')){...魔术发生...}'。 –

回答

3

不断解绑和重新绑定通常不是最好的方法。它需要比需要更多的工作。

一种选择是在悬停时在元素上设置一个类,并让其他代码在调用时检查该类的存在。

$('.myelem') 
    .on("mouseenter", function() { 
     $(this).addClass("hovering"); 
    }) 
    .on("mouseleave", function() { 
     $(this).removeClass("hovering"); 
    }) 
    .on("click", function() { 
     if ($(this).hasClass("hovering") === false) { 
      // run the code 
     } 
    }); 

类似的方法是添加了类,但使用事件委托的方法来控制行为,使得选择被定义为在不具备"hovering"类元素的工作。

$('.myelem') 
    .on("mouseenter", function() { 
     $(this).addClass("hovering"); 
    }) 
    .on("mouseleave", function() { 
     $(this).removeClass("hovering"); 
    }); 

$("#container").on("click", ".myelem:not(.hovering)", function() { 
    // run the code 
}); 
+0

+1为良好的编程方法 – StaticVariable

+0

'$ .hasClass()'将始终返回一个布尔型'true'或布尔型'false',所以'=== false'并不是真的需要。另外,您可以将重复的$ .on调用与一个调用并使用'$ .toggleClass'。从性能的角度来看,我对最后一点警惕,我认为你的意思是['.myelem:not(.hovering)'](http://api.jquery.com/not-selector/),一个':'。 –

+0

@JaredFarrish:是的,我的'.not'应该是':not'。我会更新。谢谢。我做了'=== false'有两个原因。首先是我用一个“逻辑上没有”的操作符键入它,但我想更加清楚。其次,我几乎总是使用'===',仅仅是出于习惯。这是一个个人编码标准。但是你是对的,如果我在这种情况下使用'==',比较算法将是相同的。我做了2个处理程序,因为我猜测还有更多工作要做。我可以做一个,并测试事件类型,但两个似乎更清晰。另外'toggleClass'需要第二个参数让我感觉舒适。 –

1

下面是使用class名称,以保持该元素的从反应到mouseenter mouseleave多个阻塞上下文的演示:

<div class="highlight"> 
    Hover Me 
    <button type="button">Stop Hoverable</button> 
</div> 
<div class="highlight"> 
    Hover Me 
    <button type="button">Stop Hoverable</button> 
</div> 
<div class="highlight"> 
    Hover Me 
    <button type="button">Stop Hoverable</button> 
</div> 

$('.highlight') 
    .on('mouseenter mouseleave', function(){ 
     if (!$(this).is('canceled')) { 
      $(this).toggleClass('hovered'); 
     } 
    }) 
    .on('click', 'button', function(){ 
     $(this).parent().toggleClass('canceled'); 
    });​ 

http://jsfiddle.net/rRaPB/

这是使得它的工作线:

if (!$(this).is('canceled')) { 
+0

+1我想我误解了OP想禁用哪些事件。我认为你的意图是什么。 –

+0

哦,对,我甚至没有注意到它们的区别。 –