2013-03-27 14 views
7

Cóż, to coś, co się dzieje.jQuery wypalanie kliknij wydarzenie bez kliknięcia

$('.js-custom-dropdown').find('.custom-dropdown-unfolded').toggle(); 
$('.custom-dropdown-btn, .custom-dropdown-btn-unfolded').keydown(function(event){ 
    if (event.keyCode === 13) { 
     openDropdown($(this)); 
    } 
}).click(function(){ 
    openDropdown($(this)); 
}); 

function openDropdown (element){ 
    element.parents('.js-custom-dropdown').find('.custom-dropdown-unfolded').toggle(); 
    console.log($(this)) 
} 

Kiedy klikam przycisk rozwijanej openDropdown funkcja jest wykonywana raz, ale kiedy mój sposób Tab do przycisku i naciśnij klawisz Enter, funkcja jest wywoływana dwukrotnie. Zgadnij, że ma to coś wspólnego z łańcuchem, ale przyznaję, że jestem na tym początku i nie w pełni rozumiem wzorce projektowe jQuery. Mógłbym z cource zadzwonić do funkcji dwa razy w obsłudze keydown i to rozwiązałoby problem, ale .. wiesz :)

Czy mógłbyś wyjaśnić, co jest nie tak z kodem i co powoduje takie zachowanie?

+1

jest to nie dlatego, że mają 2 detektory zdarzeń - jeden dla keydown (który zostanie uruchomiony po naciśnięciu klawisza Enter), a drugi po kliknięciu przycisku (co domyślam się robi po naciśnięciu klawisza Enter) – Pete

Odpowiedz

4

Sprowadza się to do specyfikacji interakcji użytkownika html 5. Jeśli spojrzysz na HTML spec for elements with a tabIndex, zauważysz, że wspominają one o tym, że dla każdego elementu z indeksem tabulatorów klawisz Enter powoduje kliknięcie.

Podejrzewam, że to jest przyczyną tego zachowania. Możesz wypróbować to na starszej (niezgodnej z HTML 5) przeglądarce, aby sprawdzić, czy tak jest.

Edytuj (zgodnie z postulatem z plakatu): answer given by @Terry zapewnia sposób na rozwiązanie problemu, który masz. Użycie przez jquery opcji "preventDefault" w przypadku zdarzenia spowoduje, że dwukrotne naciśnięcie klawisza Enter spowoduje zatrzymanie go.

+0

Dziękuję, że wydaje się być prawo odpowiedź. Przetestowałem stronę w IE7 i mogłem otworzyć menu za pomocą klawisza Enter. Nie miałem jednak dostępu do konsoli JS. Chociaż, czy mógłbyś zaproponować sposób, w jaki mógłbym to zrobić we wszystkich przeglądarkach? –

+0

Przyjmuję twoją odpowiedź, ponieważ odpowiada na pytanie, które napisałem, ale czy mógłbyś cytować drugą z kodem? –

1

można wywołać zdarzenie click na keydown używając: $(this).trigger('click'); i zapobiegania domyślną akcję momencie keydown:

$('.custom-dropdown-btn, .custom-dropdown-btn-unfolded').keydown(function (e) { 
    if (e.keyCode === 13) { 
     $(this).trigger('click'); 
     e.preventDefault(); 
    } 
}).click(function() { 
    openDropdown($(this)); 
}); 

Oto proof-of-concept skrzypce: http://jsfiddle.net/yTuR3/

+0

e.preventDefault() jest wystarczający. Dziękuję za pomoc –

Powiązane problemy