2008-09-08 49 views
3

我使用jquery为我的页面上的元素设置悬停回调。我现在正在编写一个模块,它需要为某些元素临时设置新的悬停行为。新模块无法访问悬停功能的原始代码。如何阅读jQuery中的绑定悬停回调函数

我想在设置新的悬停功能之前存储旧的悬停功能,以便在完成临时悬停行为后恢复它们。

我觉得这些都可以使用jquery.data()功能存储:

//save old hover behavior (somehow) 

$('#foo').data('oldhoverin',???) 

$('#foo').data('oldhoverout',???); 

//set new hover behavior 

$('#foo').hover(newhoverin,newhoverout); 

做新的悬停行为的东西...

//restore old hover behavior 
$('#foo').hover($('#foo').data('oldhoverin'),$('#foo').data('oldhoverout')); 

但我怎么得到的jQuery当前注册的悬停功能?

Shadow2531,我试图做到这一点,而无需修改最初注册回调的代码。否则你的建议可以正常工作。感谢您的建议,并帮助澄清我在寻找什么。也许我必须进入jquery的源代码并找出这些回调是如何存储在内部的。也许我应该改变这个问题:“是否可以在不修改jquery的情况下做到这一点?”

回答

3

调用事件bind方法(如hover)不会删除旧的事件处理程序,只会添加新的事件,因此您对恢复旧事件功能的想法不起作用,因为它不会删除您的事件。

您可以添加自己的事件,然后将其删除,而不会影响任何其他活动,然后使用事件命名空间:http://docs.jquery.com/Events_(Guide)#Namespacing_events

0

我不确定这是不是你的意思,但你可以绑定自定义事件,然后触发它们。

http://docs.jquery.com/Events/bind

所以添加悬停事件,脚本,你需要为悬停功能,然后触发自定义事件。

1

不知道这是否会工作,但你可以试试这个:


<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Jquery - Get, change and restore hover handlers</title> 
     <script src="jquery.js"></script> 
     <script> 
      function setHover(obj, mouseenter, mouseleave) { 
       obj.data("_mouseenter", mouseenter); 
       obj.data("_mouseleave", mouseleave); 
       obj.hover(obj.data("_mouseenter"), obj.data("_mouseleave")); 
      } 
      function removeHover(obj) { 
       obj.unbind("mouseenter", obj.data("_mouseenter")); 
       obj.unbind("mouseleave", obj.data("_mouseleave")); 
       obj.data("_mouseenter", undefined); 
       obj.data("_mouseleave", undefined); 
      } 
      $(document).ready(function() { 
       var test = $("#test"); 
       setHover(test, function(e) { 
        alert("original " + e.type); 
       }, function(e) { 
        alert("original " + e.type); 
       }); 
       var saved_mouseenter = test.data("_mouseenter"); 
       var saved_mouseleave = test.data("_mouseleave"); 
       removeHover(test); 
       setHover(test, function() { 
        alert("zip"); 
       }, function() { 
        alert('zam'); 
       }); 
       removeHover(test); 
       setHover(test, saved_mouseenter, saved_mouseleave); 
      }); 
     </script> 
    </head> 
    <body> 
     <p><a id="test" href="">test</a></p> 
    </body> 
</html> 

如果没有,也许这会给你一些想法。

0

也许会更容易,只是隐藏旧元素,并创建一个克隆,其中附加了事件处理程序?然后,只需在完成后换回旧元素。