2008-09-08 48 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

也許會更容易,只是隱藏舊元素,並創建一個克隆,其中附加了事件處理程序?然後,只需在完成後換回舊元素。