How to read bound hover callback functions in jQue

2019-05-10 03:27发布

I used jQuery to set hover callbacks for elements on my page. I'm now writing a module which needs to temporarily set new hover behaviour for some elements. The new module has no access to the original code for the hover functions.

I want to store the old hover functions before I set new ones so I can restore them when finished with the temporary hover behaviour.

I think these can be stored using the jQuery.data() function:

//save old hover behavior (somehow)

$('#foo').data('oldhoverin',???)

$('#foo').data('oldhoverout',???);

//set new hover behavior

$('#foo').hover(newhoverin,newhoverout);

Do stuff with new hover behaviour...

//restore old hover behaviour
$('#foo').hover($('#foo').data('oldhoverin'),$('#foo').data('oldhoverout'));

But how do I get the currently registered hover functions from jQuery?

Shadow2531, I am trying to do this without modifying the code which originally registered the callbacks. Your suggestion would work fine otherwise. Thanks for the suggestion, and for helping clarify what I'm searching for. Maybe I have to go into the source of jquery and figure out how these callbacks are stored internally. Maybe I should change the question to "Is it possible to do this without modifying jquery?"

4条回答
戒情不戒烟
2楼-- · 2019-05-10 03:35

Maybe it would be easier to just hide the old element and create a clone with your event handlers attached? Then just swap back in the old element when you're done..

查看更多
\"骚年 ilove
3楼-- · 2019-05-10 03:37

Calling an event bind method (such as hover) does not delete old event handlers, only adds your new events, so your idea of 'restoring' the old event functions wouldn't work, as it wouldn't delete your events.

You can add your own events, and then remove them without affecting any other events then use Event namespacing: http://docs.jquery.com/Events_(Guide)#Namespacing_events

查看更多
啃猪蹄的小仙女
4楼-- · 2019-05-10 03:38

Not sure if this will work, but you can try this:


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

If not, maybe it'll give you some ideas.

查看更多
祖国的老花朵
5楼-- · 2019-05-10 03:50

I'm not sure if this is what you mean, but you can bind custom events and then trigger them.

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

So add your hover event, script the functionality you need for that hover, then trigger your custom event.

查看更多
登录 后发表回答