2013-05-16 10 views
6

Wiem, że podobne pytania były już wcześniej zadawane, ale obserwowane przeze mnie zachowanie jest nieco inne niż to, co udało mi się znaleźć na stronie SO .preventDefault() po kliknięciu klawisza tabulatora wewnątrz obszaru tekstowego w Chrome

Mam formularz, który rozpadam na kilka kart akordeonowych jquery. Chcę, aby użytkownik mógł wypełnić pole tekstowe na karcie 1, a następnie nacisnąć klawisz Tab, aby automatycznie otworzyć zakładkę 2 i skoncentrować się na polu tekstowym na tej karcie. Problem, który mam, zapobiega domyślnemu zachowaniu klawiszy w Chrome.

$("form#new_story").keydown(function (e) { 
    if(!e) var e = window.event; 
    var keyCode = e.keyCode || e.which; 
    if (keyCode == 9) { 
     e.preventDefault(); 
     alert("tab was keyed"); 
    } 
}); 

Testowałem to w Chrome, FF i Safari. Działa dobrze w FF i Safari, ale gdy użytkownik używający klawiszy Chrome w dół klawisza tab, do pola tekstowego wprowadzana jest aktualna zakładka przed wyzwalaniem zdarzenia. Chciałbym zatrzymać to zachowanie, ale zakładka jest wyraźnie wprowadzana zanim zdarzenie się uruchomi. Czy istnieje sposób, aby to zatrzymać?

+0

Zakładka jest wprowadzana * przed * zdarzeniem "keydown"? Brzmi mało prawdopodobne. Ale aby temu zapobiec, możesz zahaczyć o "keypress" i stłumić to. – Bergi

+0

'keypress' nie przechwycił naciśnięcia tabulatora (wiem, że' keypress' nie przechwytuje klawiszy nie zawierających znaków w starszych wersjach np. Nie wiedziałem, że nie przechwyciłoby to klawiszy niebędących znakami w Chrome. "Właśnie znalazłem problem. To bardzo zabawna interakcja pomiędzy akordeonem jQuery i jQueryfikującym." Przedstawi to jako odpowiedź poniżej. –

Odpowiedz

1

Okazało się, że problem został wywołany przez sprawdzanie poprawności jquery. Byłem sprawdzania każdego pola tekstowego w formularzu z tego zestawu opcji:

$("form#new_story").validate({ 
         ignore: [], 
         onkeyup: false, //stop eager validation of fields so to not hit server each time user clicks a key in the email field 
         onfocusout: true, 
         ... 
        }; 

Jak tylko ustawić onfocusout: false udało mi się uchwycić zdarzenia Zakładka keydown jak oczekiwano.

Nie mam pojęcia, dlaczego tak się stało. Musi to być błąd w akordeonie jQuery lub jQuery.

Powiązane problemy