ユーザーインタラクションを使用してjQuery .mouseenter()/。mouseleave()スクリプトを取得する際の問題

まず、タイトルの謝罪、私は適切なものを考えることができませんでした。

私は、以下のコード内のhide()関数が起動時に誤ったフックで戻ってくる理由を確信しています。この欠陥のアイロンをかけたら、残りのコードはうまく動作するでしょう。ヘルプ/提案は高く評価されます。 。

Firebugコンソールエラー:

hide is not defined
it-services() it-services (line 396)
time = setTimeout("hide()",3000); 

コード私はこれまでのところ:

        var time;

        $("#form").mouseenter(function() {
            clearTimeout(time);
            $(this).delay(800).animate({
                right: 0
            }, 2000);
        }).mouseleave(function() {
            function hide() {
                $(this).delay(800).animate({
                    right: "-325px"
                }, 1000);
            }
            time = setTimeout(hide,3000);
        });

事前にお手伝いいただきありがとうございます。

ダン。

1

2 答え

setTimeout を使用してコードを呼び出すと、 hide()関数が宣言されます。宣言を setTimeout の前に置くだけです。

また、 setTimeout の最初の引数として一連のコードを渡すと、 eval が取得されます。 eval は悪です。関数オブジェクトを渡すだけです:

function hide() {
    $(this).delay(800).animate({
        right: "-325px"
    }, 1000);
}
time = setTimeout(hide, 3000);
1
追加された
元のコードを編集してコードを表示しましたが、コードは機能しません。新しいエラーが発生します。 elem.ownerDocumentは未定義です。if(!(defaultView = elem.ownerDocument.defaultView)){}
追加された 著者 zealisreal,

新しいコードには2つの問題があります

  1. hide関数の内部では、$(this)のコンテキストは mouseout関数の中で呼び出されているとき。
  2. 次に、hide関数は、mouseout関数内の無名関数として定義されています。

私は、それがmouseoverイベント処理関数の外で宣言された関数であれば、より意味をなさないと感じています。こうすることで、setTimeOutとmouseoutイベントハンドラからグローバルに参照できます。以下のコードを試してみてください。私はこれが問題を解決すべきだと思っている、あるいは少なくともあなたに前進していると思う。

var time;
var $form;

$("#form").mouseenter(function() {
    $form = $(this);
    clearTimeout(time);
    $(this).delay(800).animate({
        right: 0
    }, 2000);
}).mouseleave(function() {
    hide();
    time = setTimeout(hide,1000);
});
function hide() {
    $form.delay(800).animate({
        right: "-325px"
    }, 3000);
}
1
追加された
良いコメントですが、hide()を.mouseleave()のスコープの外に置くのは間違いありません。
追加された 著者 zealisreal,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript