Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在jQuery中读取绑定的悬停回调函数_Javascript_Jquery_Callback - Fatal编程技术网

Javascript 如何在jQuery中读取绑定的悬停回调函数

Javascript 如何在jQuery中读取绑定的悬停回调函数,javascript,jquery,callback,Javascript,Jquery,Callback,我使用jQuery为页面上的元素设置悬停回调。我现在正在编写一个模块,它需要为一些元素临时设置新的悬停行为。新模块无法访问悬停函数的原始代码 我希望在设置新的悬停函数之前存储旧的悬停函数,以便在完成临时悬停行为后恢复它们 我认为可以使用jQuery.data()函数存储这些数据: //save old hover behavior (somehow) $('#foo').data('oldhoverin',???) $('#foo').data('oldhoverout',???); //

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

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


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

不确定这是否可行,但您可以尝试以下方法:


<!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>

Jquery-获取、更改和恢复悬停处理程序
功能设置悬停(obj、mouseenter、mouseleave){
对象数据(“鼠标指针”,鼠标指针);
对象数据(“mouseleave”,mouseleave);
对象悬停(对象数据(“_mouseenter”)、对象数据(“_mouseleave”);
}
功能移除悬停(obj){
对象解除绑定(“鼠标指针”,对象数据(“鼠标指针”);
对象解除绑定(“mouseleave”,对象数据(“u mouseleave”);
对象数据(“鼠标指针”,未定义);
对象数据(“_mouseleve”,未定义);
}
$(文档).ready(函数(){
var测试=$(“#测试”);
设置悬停(测试,功能(e){
警报(“原始”+e.type);
},功能(e){
警报(“原始”+e.type);
});
var saved_mouseenter=test.data(“_mouseenter”);
var saved_mouseleave=test.data(“_mouseleave”);
移除悬停(测试);
setHover(测试,函数(){
警报(“zip”);
},函数(){
警报(“zam”);
});
移除悬停(测试);
设置悬停(测试、保存的鼠标指针、保存的鼠标指针);
});


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

调用一个事件
bind
方法(例如
hover
)不会删除旧的事件处理程序,只会添加新的事件,因此“还原”旧事件函数的想法不会起作用,因为它不会删除你的事件


您可以添加自己的事件,然后在不影响任何其他事件的情况下删除它们,然后使用事件名称空间:

也许隐藏旧元素并创建一个连接了事件处理程序的克隆会更容易?完成后,只需将旧元素调回