4

次のコードを実行しています。

<html>
<body>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>
    <script type="text/javascript">
    $(document).ready(function() {
        $('html').on('mouseleave', function(e) {                                                    
            console.log('mouseleave');
        });   
        $('#text1').on('focusout', function () {
            alert("focusout");
            setTimeout(function(){$('#text1')[0].focus();},0);
        });
    });
    </script>
    <input type=text id="text1">
</body>
</html>

テキスト入力で focusout イベントをトリガーする前にマウスをブラウザーのツールバー/タブ/リンク/その他の領域に移動すると、mouseleave イベントが発生し、更新ボタンまたはその他のボタン/タブ/その他を押すことができます。

ただし、focusout イベントをトリガーした後、mouseleave イベントは発生しなくなり、focusout によってその領域のボタンを押すことができなくなります。

マウスをブラウザのドキュメント ウィンドウから別のアプリケーションまたはバックグラウンドに移動したり、firebug ウィンドウに移動したりすると、mouseleave イベントが発生しますが、マウスをブラウザのツールバー/タブ/リンク/その他の領域に移動すると発生しません。

ただし、手動でテキスト入力に戻ると、マウスリーブが再び正常に起動し始めます。

この動作は、IE、Chrome、または Safari では発生せず、Firefox でのみ発生します (私は Firefox 21 を使用しています)。

提案や説明は大歓迎です!

ダナ

4

2 に答える 2

3

さらに調査した結果、これは jQuery の問題ではなく Firefox の問題であると思われます。これは、この状況では Firefox で mouseout イベントも適切に発生しないためです。mousemove を使用し、イベントのターゲットと relatedTarget をチェックすることで、これらすべてを回避することになりました。この状況が発生した場合 (アラートが開いた後)、mousemove イベント ターゲットは null であり、関連するターゲットはページのメニュー セクションでのみ定義されていないため、それを確認することで、そのセクションにいることがわかり、それを処理できます。適切に。

最終的に使用したコードは次のとおりです。

    $(document).on('mousemove', function(e) {
        if (!e.target.tagName && !e.relatedTarget) {
             console.log('mouseleave');
        }
    });
于 2013-06-28T17:24:58.623 に答える