如何在jQuery中读取绑定的悬停回调函数
时间:2020-03-05 18:49:06 来源:igfitidea点击:
我使用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的情况下做到这一点?"
解决方案
回答
我不确定这是否是意思,但是我们可以绑定自定义事件,然后触发它们。
http://docs.jquery.com/Events/bind
因此,添加悬停事件,编写该悬停所需的功能脚本,然后触发自定义事件。
回答
不知道这是否行得通,但是我们可以尝试以下操作:
<!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>
如果没有,也许会给我们一些想法。
回答
调用事件" bind"方法(例如" hover")不会删除旧的事件处理程序,只会添加新事件,因此我们"恢复"旧事件功能的想法将不起作用,因为它不会删除事件。
我们可以添加自己的事件,然后在不影响任何其他事件的情况下将其删除,然后使用事件名称间隔:http://docs.jquery.com/Events_(Guide)#Namespacing_events
回答
也许隐藏旧元素并创建添加了事件处理程序的克隆会更容易?完成后,只需换回旧元素即可。