我使用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 behaviour
$('#foo').hover($('#foo').data('oldhoverin'),$('#foo').data('oldhoverout'));
但是如何从jQuery获取当前注册的悬停函数?
Shadow2531,我试图在不修改最初注册回调的代码的情况下执行此操作。否则你的建议会正常工作。感谢您的建议,并帮助澄清我正在寻找的内容。也许我必须进入jquery的源代码并弄清楚这些回调是如何在内部存储的。也许我应该将问题改为“是否可以在不修改jquery的情况下执行此操作?”
答案 0 :(得分:3)
调用事件bind
方法(例如hover
)不会删除旧事件处理程序,只会添加新事件,因此您“恢复”旧事件函数的想法将无效,因为它不会删除你的活动。
您可以添加自己的事件,然后删除它们而不影响任何其他事件,然后使用事件命名空间:http://docs.jquery.com/Events_(Guide)#Namespacing_events
答案 1 :(得分: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>
如果没有,也许它会给你一些想法。
答案 2 :(得分:0)
我不确定这是不是你的意思,但你可以绑定自定义事件然后触发它们。
http://docs.jquery.com/Events/bind
因此,添加您的悬停事件,编写悬停所需的功能,然后触发您的自定义事件。
答案 3 :(得分:0)
也许隐藏旧元素并在附加事件处理程序的情况下创建克隆会更容易?然后在完成后再换回旧元素。