15

気付いたばかりのフォーカスイベントに少し問題があります。どうやら、別のブラウザタブに切り替えてから再び戻ると、フォーカスが発生します。私はそれが起こらないようにしたいです。出来ますか?

私は今日までこれに気づきませんでした。ここに小さなデモがあります: http://jsfiddle.net/MJ6qb/1/

var times = 0;
$('input').on('focus', function() {
    times ++;
    $(this).after('<br>Focused '+times+' times');   
});

再現するには: 入力に集中し、ブラウザのタブを切り替えてから元に戻します。タブに戻ると、すべてのブラウザーがフォーカス イベントを発生させるように見えますが、Google Chrome 19 では 2 回発生しています。

理想的には、関数はブラウザのタブを切り替えるときに実行されるべきではなく、ユーザーがクリックまたはクリックしたときにのみ実行される必要がありますTabが、Chrome の問題を認識したので、余分な不要な back-to-私の実際のアプリでAJAXリクエストを返します(最新である必要があるオートコンプリートの結果を取得するためですが、keyupイベントを使用したいほどではありません)。

jQuery に関連しているようには見えませんが (バニラ JavaScript でテストしました)、解決策として jQuery を使用できます。これについて私にできることはありますか?jQuery を使用できることはわかってone()いますが、関数を複数回実行したいと考えています。

4

2 に答える 2

8

これを試してください

var times = 0;
var prevActiveElement;

    $( window ).on( "blur", function(e){
            prevActiveElement = document.activeElement;
    });

    $('input').on('focus', function() {
        if (document.activeElement === prevActiveElement) {
            return;
        }
        prevActiveElement = document.activeElement;
        times++;
        $(this).after('<br>Focused ' + times + ' times');
    }).on( "blur", function(){
        prevActiveElement = null;  
    });​
于 2012-05-18T17:57:48.077 に答える
3

問題を回避するためにこれを試してください:

var times = 0, foc=true;

$(window).on('focus', function() {
    foc = false;
    setTimeout(function() {foc=true}, 200);
});

$('input').on('focus', function() {
    if (foc || times===0) {
        times ++;
        $(this).after('<br>Focused '+times+' times');   
    }
});

</p>

フィドル </p>

于 2012-05-18T17:50:30.803 に答える