3

私はJavaScriptに比較的慣れていないので、私に対してそれを保持してください。

ユーザーがベースメニューからサブメニューに到達するのに少し時間を与えるコードが少しあります。私の問題は、コードが奇妙な順序で実行され続けることです。

コードは次のとおりです。

function onFocusOut() {
    var tester = 0;
    setTimeout(function(){menuReset(tester)},1000);
}

function menuReset(tester) {    
    var hoverCheck = function (event) {
        alert("#navBase a has focus"); //is fired, but to late...
        var tester = event.data.varTester;
        var tester = 1;
    };

    jQuery('#navBase').on('mousemove', 'a', { varTester: tester }, hoverCheck);
    jQuery('#navBase').off('mousemove', 'a', { varTester: tester }, hoverCheck);

    alert(tester);   //This keeps firing first, before the alert in hoverCheck

    if(tester == 1){
        alert("tester = 1");
        return;
    }

    else {
        jQuery('#navBase ul').hide();
        jQuery('#navBase').css({'width': ''});
        jQuery('#navBaseAnchor').css({
            'width': '', 'color': '', 
            'font-size': '', 
            'border-bottom-style': '', 
            'border-bottom-width': '', 
            'border-bottom-color': ''});

        tester = 0;
    }
}

hoverCheck関数が実行される前に(「テスター」を1に設定する必要があります)、その関数内でアラートを発生させる前に、「テスター」が0であるというアラートを受け取り続けます。

誰かが私が間違っていることを教えてもらえますか?

4

4 に答える 4

1

私も JS にかなり慣れていませんが、変数スコープのエラーにも注意する必要がありますか?

inと inでtesterローカルに宣言し、それを外部でグローバル変数として呼び出しましたか?onFocusOut()menuReset(tester)

answer.oreilly.comから

  • LOCAL - 関数に固有のもので、その関数でのみ動作します。
  • GLOBAL - 関数内で定義されていないものであり、関数がその変数を必要としない場合を除き、関数にも役立つ可能性があります。
于 2012-08-08T08:08:01.087 に答える
1

人々を気にしないでください...私はそれをすべて回避する方法を見つけました。現在.focus()、関連するアンカーに を設定していmouseOverます。(そしてもちろん)blur()mouseleave使用して、現在フォーカスされている要素を確認するのは本当に簡単document.activeElementです。

少し異なる方法ではありますが、問題は解決しました。

于 2012-08-08T13:23:48.817 に答える
0

alert(tester)ユーザーとして気付く何かを実行しているコードの最初の行です。2 つの関数呼び出しjQuery().on()jQuery().off()は、イベント ハンドラーをアタッチするだけです。アラートに「1」を表示したい場合は、hoverCheck実行する前にマウスを素早く動かさなければなりません。しかしおそらく、JavaScript が次の行に到達するよりも速く手を動かすことはできませalert()tester

于 2012-08-08T07:55:51.070 に答える
-1

少し異なるアプローチは、Javascript timeout() を設定して、特定の条件が満たされない場合に一定時間後にサブメニューを非表示にすることです。

この JSFiddle の例を確認してください

頑張ってください!

于 2012-08-09T21:53:16.407 に答える