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

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

于 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 に答える