2013-03-27 14 views
7

Beh, questo è un po 'quello che succede.jQuery evento di attivazione scatto senza un clic

$('.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)) 
} 

quando clicco sul pulsante a discesa, openDropdown funzione viene eseguita una volta, ma quando ho il mio modo Tab al pulsante e premere invio, la funzione viene chiamata due volte. Suppongo che abbia qualcosa a che fare con il concatenamento, ma ammetto di essere nuovo in questo e di non comprendere appieno i modelli di design di jQuery. Potrei chiamare la funzione due volte nel gestore keydown e questo risolverebbe il problema, ma .. lo sai :)

Potresti spiegare cosa c'è di sbagliato nel codice e cosa causa questo comportamento?

+1

non è vero perché si avere 2 ascoltatori di eventi - uno per il keydown (che si accenderà quando si preme invio) e l'altro per quando si fa clic sul pulsante (che immagino sia quello che si sta facendo quando si preme invio) – Pete

risposta

4

Questo dipende dalle specifiche di interazione utente 5 in HTML. Se dai un'occhiata allo HTML spec for elements with a tabIndex scoprirai che menzionano che per qualsiasi elemento con un indice di tabulazione il tasto invio causa un evento click.

Sospetto che sia ciò che sta causando questo comportamento. Puoi provare su un browser più vecchio (non compatibile con HTML 5) per verificare se questo è il caso.

Modifica (come richiesto dal poster): answer given by @Terry fornisce un modo per risolvere il problema riscontrato. L'uso di "preventDefault" di jquery sull'evento interromperà il doppio colpo quando premi Invio.

+0

Grazie, sembra essere il giusto risposta. Ho testato la pagina in IE7 e sono stato in grado di aprire il menu a discesa con il tasto Invio. Non avevo però accesso alla console JS. Tuttavia, potresti suggerire un modo per farlo funzionare in tutti i browser? –

+0

Accetterò la tua risposta perché risponde alla domanda che ho postato, ma potresti citare l'altro con il codice? –

1

È possibile attivare l'evento click sul keydown utilizzando: $(this).trigger('click');, e il impedendo l'azione di default su keydown:

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

Ecco un proof-of-concept violino: http://jsfiddle.net/yTuR3/

+0

e.preventDefault() è sufficiente. grazie per l'aiuto –

Problemi correlati