2012-05-18 18 views
11

Mam problem z wydarzeniem, na którym się właśnie zorientowałem. Wygląda na to, że fokus uruchamia się po przełączeniu na inną kartę przeglądarki, a następnie z powrotem. Wolałbym, żeby tak się nie stało; Czy to możliwe?Zmiana zakładek przeglądarki powoduje niepożądane wywołanie fokusu, szczególnie w przeglądarce Google Chrome

Nigdy nie zdawałem sobie z tego sprawy aż do dzisiaj. Oto mały demo: http://jsfiddle.net/MJ6qb/1/

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

Aby odtworzyć: Skupienie na wejściu, a następnie przełączyć zakładki przeglądarki, a następnie powrócić. Po przełączeniu z powrotem do karty wszystkie przeglądarki wydają się uruchamiać fokus i Google Chrome 19 uruchamia go dwukrotnie:!

Idealnie, funkcja nie powinna działać podczas przełączania kart przeglądarki w ogóle, ale tylko po kliknięciu przez użytkownika lub Tab, ale teraz, że jestem świadomy kwestii Chrome jestem trochę bardziej zaniepokojony, bo to wynikająca w dodatkowych, niechcianych żądaniach AJAX w mojej prawdziwej aplikacji (służy do pobierania wyników autouzupełniania, który musi być aktualny, ale nie tak bardzo, że chcę użyć zdarzenia keyup).

To nie wydaje się być związane z jQuery (testowałem z javascriptem wanilii), ale mogę użyć jQuery do rozwiązania. Czy mogę coś z tym zrobić? Wiem, że mogę używać jQuery's one(), ale chcę, aby funkcja działała więcej niż jeden raz.

+1

Nieco niepowiązanych, ale może być w stanie wykryć, kiedy zakładka przeglądarki jest skupiona lub rozmyta i ove rride domyślne zachowanie jak w [this] (http://stackoverflow.com/a/6184276/1028949). Podwójny pożar Chrome to [znany błąd] (http://code.google.com/p/chromium/issues/detail?id=124583) z tego, co potrafię powiedzieć. – Quantastical

+0

Ach, dzięki, nie zdawałem sobie sprawy, że to znany błąd, ale znalazłem go podczas testowania kodu w Chrome tuż przed opublikowaniem, aby upewnić się, że nie jest to rzecz FF (w której się rozwijam). Czuję, że poddaję się i "puszczam", ale to naprawdę denerwujące. Zobaczę, czy mogę coś zrobić z kodem w tej odpowiedzi. –

+1

Zachowanie, którego doświadczasz, jest oczekiwane. Kiedy wyjdziesz z tej zakładki, nie skupiasz się na tym polu, a kiedy wrócisz, skupiasz go ponownie. To samo dotyczy pozostawiania do innej aplikacji. Niestety, nie mogę wymyślić sposobu na obejście tego problemu. – Quantastical

Odpowiedz

5

Spróbuj this

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; 
    });​ 
+0

Wygląda tak, jak to działa! Dzięki za obejście problemu! Nigdy też nie wiedziałem o "activeElement", więc podwójne podziękowania za tę informację. –

+0

Nawiasem mówiąc, działa to również doskonale w produkcji z wieloma wejściami: http://jsfiddle.net/MJ6qb/5/ (jeśli jesteś ciekawy, otwórz konsolę, aby zobaczyć żądania). –

+0

@WesleyMurch '' ("body"). On ("blur") 'nie jest w ogóle uruchamiane. 'Blur' nie bańka, prawdopodobnie chcesz' $ ("body"). On ("focusout", "[autouzupełnianie danych]", fn) '. Odpowiednikiem fokusu jest '$ (" body "). On (" focusin "," [autouzupełnianie danych] ", fn)' – Esailija

3

Spróbuj obejść problem:

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'); 
    } 
}); 

FIDDLE

+0

Do tej pory nie uruchamia się po kliknięciu, chyba że najpierw skupimy się na innej metodzie, takiej jak TAB (lub najpierw kliknięciu innego wejścia) - nadal testujemy. Ale tak, ciekawe rozwiązanie! –

+0

To dziwne, wygląda na to, że działa dobrze tutaj w Chrome, zdarzenie fokusa jest uruchamiane za każdym razem, ale nie na karcie przeglądarki. – adeneo

+0

Po prostu nie działa, jeśli klikniesz wejście przed wykonaniem czegokolwiek innego. @adeno Czy próbowałeś tego? –

Powiązane problemy