jQuery / js che si occupano di 'doppio fuoco' con il cursore e l'evento
Domanda
Sono consentendo la navigazione da tastiera per un menu. Io corro in un problema in una situazione particolare:
<ul>
<li><a href="" class="link1">link</a></li>
<li><a href="" class="link2">link</a></li>
<li><a href="" class="link3">link</a></li>
</ul>
jQuery:
$('ul').keypress(function (eh){
var keyPressed = eh.keyCode;
if (keyPressed=='37'){
$currentFocusedLink.closest('li').prev('li:first').find('a:first').focus()
};
Quello che succede:
Sono catturare i tasti freccia per navigare tra i menu. Questo funziona tranne quando il cursore si trova prima del primo carattere di un collegamento e mi ha colpito la freccia indietro.
Nei Credo accade è che il cursore si sposta e quindi la pressione del tasto viene catturato. Perché il cursore si sposta nel tag di ancoraggio precedente, poi innesca messa a fuoco. Ma perché sto anche catturare la pressione dei tasti e l'assegnazione di messa a fuoco, qualunque sia il mio caso messa a fuoco è viene chiamato due volte.
Un modo per aggirare questo problema?
UPDATE:
Ecco un po 'di codice di esempio per provare ad ottenere una buona idea di ciò che sta accadendo.
HTML:
<div class="testNav">
<a href="">TEST LINK 1</a>
<a href="">TEST LINK 2</a>
<a href="">TEST LINK 3</a>
<a href="">TEST LINK 4</a>
<a href="">TEST LINK 5</a>
</div>
JQuery:
var $ activeLink;
$('.testNav')
.find('a')
.focus(function(){
$activeLink = $(this);
})
.end()
.keypress(function (eh){
var keyPressed = eh.keyCode;
if (keyPressed=='37'){
$activeLink.prev('a').focus()
};
});
Si noti che è possibile scheda avanti e indietro per ogni link che bene.
Ora, scheda per il 5 ° di collegamento e spingere la freccia indietro. Si passa al LINK 3. Premere di nuovo e va a LINK 1.
I pensare La ragione è come detto sopra ... il mio script applica messa a fuoco, ma così fa l'atto di spostare il cursore nel tag di ancoraggio precedente. Sia questo accada quando si preme la freccia indietro.
Soluzione 2
SOLUZIONE:
Questo dovrebbe essersi verificato a me prima, ma l'eventuale correzione è stata per attaccare 'preventDefault ()' per l'evento KeyPress. La chiave è quello di individuare prima i tasti premuti, allora solo preventDefault sui tasti particolari che stai cercando (oppure perdere la funzionalità della tastiera sulla pagina web).
Altri suggerimenti
È possibile utilizzare il jCaret plugin per controllare se il cursore è stato prima della prima carattere e gestire questa situazione come un caso limite.