5

我使用 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 的情况下执行此操作?”

4

4 回答 4

4

调用事件bind方法(例如hover)不会删除旧的事件处理程序,只会添加您的新事件,因此您“恢复”旧事件函数的想法不会奏效,因为它不会删除您的事件。

您可以添加自己的事件,然后在不影响任何其他事件的情况下删除它们,然后使用事件命名空间:http ://docs.jquery.com/Events_(Guide)#Namespacing_events

于 2008-09-08T10:35:30.263 回答
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>

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

于 2008-09-08T03:30:48.787 回答
0

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

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

因此,添加悬停事件,编写悬停所需的功能脚本,然后触发自定义事件。

于 2008-09-08T02:30:05.517 回答
0

也许隐藏旧元素并创建一个附有事件处理程序的克隆会更容易?然后在完成后换回旧元素..

于 2008-09-08T13:23:59.657 回答