2

</body>マークアップを出力した後 ( :の直前)、これを実行しています。

$(document).ready(function() {
.....
    focusLeaving: function(){
                    e('#running');
                    $('.levelThree').on('mouseleave',function () {
                        e('remove');
                        MM.internalMenu.levelFive.close(function(){});
                        MM.internalMenu.levelThree.close($(this));
                        $(this).parent().removeClass('active');
                    });
                }
    //This outputs as expect: '#running'
....
});

ただし、放置すると.levelThree何も起こりません。コンソール内で上記のコードを実行するか、コンソールを介して関数自体を実行すると、関数はそれMM.internalMenu.levelThree.focusLeaving();に応じて機能します。

これは私を混乱させます。うまくいくはずです。私はそれが動いていることさえ知っているのに、なぜそれがうまくいかないのですか....

4

2 に答える 2

0

関数を使用するonということは、イベントをコールバック ハンドラにバインドしていることを意味します。$('.levelThree').on('mouseleave',function () { .... }これは、「今後、アイテムで mouseleave イベントがトリガーされたときに、この関数を実行する」ということと同じです。

関数自体はその時点では実行されず、mouseleave イベントが発生したときにのみ実行されるように設定されます。

さらに説明するには:

<a id="my_link" href="#"> click me! </a>

これをクリックしても、何も起こりません。You clicked me!クリックしたときにそれを言うとします。関数を使用して設定する必要がありonます。

$("#my_link").on('click', function {
    alert("You clicked me!");
});

メッセージが表示された警告ボックスがまだ表示されていないことに注意してください。クリック時に表示されるアラート ボックスを設定しただけです。リンクをクリックする、アラート ボックスが表示されます。

注意すべき重要なことは、イベント ハンドラーを設定してもイベント自体はトリガーされないということです。ただし、そのコードをコンソールで実行すると、直接実行されます。これは、コンソールで実行したときにコードが機能する理由を説明しています。

focusLeavingマウスがアイテムから離れたときに発生するイベントだと思いますか?その場合、これを修正する最も簡単な方法は、on関数を削除することです。これは、既にイベントが発生して実行されているためです。2回設定しているため、直面している問題が発生しています。

于 2013-03-11T12:44:51.790 に答える
0

スクリプトを でラップしました$(document).ready(function() { ... }か? MMDOM の準備ができた後に JS 関数を実行すると、スクリプトが定義されていると仮定して、おそらくスクリプトが再び機能するようになります。

公式ドキュメントによると:

.ready() に渡されたハンドラーは、DOM の準備が整った後に実行されることが保証されているため、これは通常、他のすべてのイベント ハンドラーをアタッチして他の jQuery コードを実行するのに最適な場所です。

于 2013-03-11T10:19:22.520 に答える