2011-09-12 18 views
6

Ho un problema di usabilità su un mio sito web. Ho una serie di schede, ognuna contenente un modulo. Quando si fa clic sul collegamento della scheda, si concentra sulla prima casella di testo nel corpo del contenuto della scheda. Le persone orientate al mouse amano questa "caratteristica". Il problema è quando gli utenti orientati alla tastiera usano il tasto TAB sulla loro tastiera per scorrere le schede. Colpiscono invio nella scheda che vogliono guardare, l'evento click si attiva e la scheda viene visualizzata, ma l'attenzione viene data alla casella di testo, regolando completamente l'ordine di tabulazione. Quindi, quando premono di nuovo la scheda, vogliono andare alla scheda successiva sullo schermo, ma poiché l'attenzione è stata spostata all'interno del modulo, non possono facilmente accedere alla scheda successiva utilizzando la tastiera.jQuery click event - Come sapere se il mouse è stato premuto o il tasto Invio è stato premuto?

Quindi, all'interno dell'evento click ho bisogno di determinare se effettivamente hanno cliccato su di esso con un pulsante del mouse. È possibile? Il mio primo tentativo è stato questo:

$("#tabs li a").click(function(e) { 
    var tab = $(this.href); 
    if(e.keyCode != 13) 
    $("input:first", tab).focus(); 
}); 

Ma keyCode è sempre 0. La proprietà which è sempre 0. Si prega di aiutare!

+0

Probabilmente ci si può incappare mettendo un gestore .focus() sulla casella di testo con un po 'di logica. – krasnerocalypse

+0

@krasnericalypse Err, non proprio. Una volta che l'attenzione è stata data alla casella di testo/menu a discesa, è troppo tardi per recuperare. –

+0

haha. questo è difficile. – krasnerocalypse

risposta

4

Ecco la soluzione che ho trovato, è sorprendentemente semplice. Ho intrappolato keydown sui link scheda, e ha attivato l'evento click quando keyCode era 13. Per fortuna, la funzione trigger ci permette di passare parametri aggiuntivi al gestore di eventi ...

$("#tabs li a").keydown(function(e) { 
    if(e.keyCode == 13) { 
    $(this).trigger("click", true); 
    e.preventDefault(); 
    } 
}); 

Così ho dovuto cambiare il mio clicca gestore per ricevere il nuovo parametro e usarlo ...

$("#tabs li a").click(function(e, enterKeyPressed) { 
    if(enterKeyPressed) 
    alert("Enter key"); 
    else 
    alert("Clicked"); 
}); 

ho messo su un demo on jsFiddle pure. Grazie a tutti quelli che hanno letto la domanda.

+0

ho finito di fare la stessa cosa per 4 minuti, siamo genius = P – AgelessEssence

0

Una variabile "di messa a fuoco" globale funzionerebbe, che disabilita la messa a fuoco sull'impostazione del mouse dopo l'utilizzo della scheda in una data scheda fino a quando il mouse non viene spostato in un nuovo blocco.

Questa non sarebbe la funzione richiesta dall'utente, ma credo che potrebbe darti quello che stai cercando.

es. opzione 5 di mouse hoover, premi scheda, ora memorizzi il 5 nella variabile, disabilitando il focus su 5 fino a quando qualcos'altro è stato focalizzato, ma appena qualcos'altro è focalizzato, il globale torna a -1.

Soluzione non più pulita, lo ammetto liberamente.

+0

Non posso avere molti gestori di eventi in corso ... queste forme sono grandi. Questo bloccherà sicuramente il browser. –

Problemi correlati