2009-11-26 36 views
14

Ho un modulo con molte voci. Vorrei spostare il focus sulla casella di testo successiva, una volta inserito il valore nella casella di testo corrente. e voglio continuare questo processo fino all'ultimo campo. La mia domanda è, è possibile simulare la chiave di tabulazione con la codifica javascript una volta che inserisco il valore nella casella di testo.simulare la funzione tasto tab in javascript

Senza premere il tasto Tab sulla tastiera, vorrei portare la stessa funzionalità tramite javascript. È possibile ?

+8

Questo fa schifo, sto cercando un 'scheda key' e le risposte qui danno solo il prossimo '.focus()'. Complesso – Qwerty

+0

! vedere questa discussione correlata: http://stackoverflow.com/questions/961532/firing-a-keykey-event-in-javascript – ptim

+0

@praveenjayapal mai ottenere una risposta che simula il tasto tab e non solo cambiare focus ?? – Pomster

risposta

12
function nextField(current){ 
    for (i = 0; i < current.form.elements.length; i++){ 
     if (current.form.elements[i].tabIndex == current.tabIndex+1){ 
      current.form.elements[i].focus(); 
      if (current.form.elements[i].type == "text"){ 
       current.form.elements[i].select(); 
      } 
     } 
    } 
} 

Questo, quando fornito con il campo corrente, salterà a fuoco sul campo con l'indice di tab successivo. Uso sarebbe la seguente

<input type="text" onEvent="nextField(this);" /> 
+0

Non funziona se l'indice delle schede non è impostato manualmente in HTML. La proprietà '.tabIndex' restituisce 0. –

31

non vi resta che dare fuoco al campo di immissione successivo (richiamando il metodo di messa a fuoco() su tale elemento di input), ad esempio, se si sta utilizzando questo codice jQuery simulerà la scheda chiave Azionando eNTER:

var inputs = $(':input').keypress(function(e){ 
    if (e.which == 13) { 
     e.preventDefault(); 
     var nextInput = inputs.get(inputs.index(this) + 1); 
     if (nextInput) { 
      nextInput.focus(); 
     } 
    } 
}); 
+9

@John jQuery è una libreria JavaScript, quindi qualsiasi" codice jquery "è anche codice JavaScript valido. Ho risposto a questa domanda 3 anni fa e nella mia risposta ho inserito "se stai usando jQuery". Se qualcuno mi chiedesse (allora) di fornire una soluzione "vanilla js" probabilmente lo farei. Semplicemente non capisco le persone come te (senza offesa) che attraversano domande davvero vecchie e giù votano le risposte delle persone. Sembra che lo stiate facendo solo per divertimento ... – krcko

+0

@John Non so davvero cosa innerHTML abbia a che fare con l'attraversamento dell'albero DOM e focalizzando un elemento (come nell'esempio che ho dato) ma FYI innerHTML è parte di [ HTML 5 bozza di lavoro] (http://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml0) (e potrei aggiungere - finalmente!). Ad ogni modo, potrebbe non essere standardizzato fino ad ora, ma è stato sicuramente supportato da tutti i principali browser per molto tempo. – krcko

+0

Sono comunque d'accordo sul fatto che jQuery sia decisamente un overkill per piccoli esempi come questo, ma in realtà questo non sarà l'unico codice javascript sulla tua pagina, quindi l'uso di jQuery (o qualche altra libreria) è incoraggiato dal momento in cui scrivi il tuo il proprio codice cross-browser è giustamente considerato come reinventare la ruota (che è stata reinventata troppe volte se potrei aggiungere) e non sarà sicuramente in grado di coprire tutti i casi limite esistenti su vari browser su vari dispositivi (e questa quantità di varietà è in costante aumento negli ultimi anni). – krcko

16

Necessario per emulare la funzionalità scheda qualche tempo fa, e ora ho released it as a library che utilizza .

EmulateTab: Un plug-in jQuery per emulare il tabulazione tra gli elementi di una pagina.

È possibile see how it works in the demo.

if (myTextHasBeenFilledWithText) { 
    // Tab to the next input after #my-text-input 
    $("#my-text-input").emulateTab(); 
} 
+7

@ John: grazie per la tua opinione. –

+5

EmulateTab è un'ottima soluzione a questo problema. Certo, è jquery, ma è comunque pertinente alla domanda IMO – DarinH

+3

In suvated per emulare effettivamente il tasto di pressione della scheda, tutte le altre risposte sono inutili. – Qwerty

1

Nella prima domanda, non è necessario un listener di eventi su ogni input che sarebbe uno spreco.

Invece, ascoltare il tasto Invio e di trovare l'elemento attualmente focalizzato utilizzare document.activeElement

window.onkeypress = function(e) { 
    if (e.which == 13) { 
     e.preventDefault(); 
     var nextInput = inputs.get(inputs.index(document.activeElement) + 1); 
     if (nextInput) { 
      nextInput.focus(); 
     } 
    } 
}; 

Un listener di eventi è migliore di molti, soprattutto a basso/browser mobili di potenza.

+1

Nessun prossimo input (nextInput) sarà focalizzato se nextInput è disabilitato, nascosto o ha un genitore che è nascosto. Devo eseguire questi controlli. –

+2

Non si dichiara nemmeno la variabile di input. Eh? – dthree

-1

Ho adattatore la risposta di ltiong_sh a lavorare per me:

function nextField(current){ 
    var elements = document.getElementById("my-form").elements; 
    var exit = false; 
    for(i = 0; i < elements.length; i++){ 
     if (exit) { 
      elements[i].focus(); 
      if (elements[i].type == 'text'){ 
       elements[i].select(); 
      } 
      break; 
     } 
     if (elements[i].isEqualNode(current)) { 
      exit = true; 
     }  
    } 
} 
1

Questo simula una scheda attraverso una forma e dà fuoco al successivo ingresso quando si preme il tasto Invio.

window.onkeypress = function(e) { 
    if (e.which == 13) { 
     e.preventDefault(); 
     var inputs = document.getElementsByClassName('input'); 
     for (var i = 0; i < inputs.length; i++) { 
     if (document.activeElement.id == inputs[i].id && i+1 < inputs.length) { 
      inputs[i+1].focus(); 
      break; 
     } 
    } 
0

Non sono riuscito a trovare una risposta che potesse fare ciò che volevo. Ho avuto un problema in cui c'erano alcuni elementi di collegamento che non volevo che gli utenti facessero tabulazioni. Questo è ciò che mi si avvicinò con:

(. Si noti che nel mio codice ho usato a:not(.dropdown-item) invece di a sulla linea var all)

function(event){ 
     //not that this doesn't work with tab-indexes 

     //allows fluid tabbing through 

     //isolate the node that we're after 
     var current = event.target; 

     //find all tab-able elements 
     var all = document.querySelectorAll('input, button, a, area, object, select, textarea'); 

     var currentIndex; 

     for(var i = 0; i < all.length; i++){ 
      //loop through all tab-able elements 
      if(current.isEqualNode(all[i])){ 
       //if a match is found then assign index 
       currentIndex = i; 
      } 
     } 

     //focus the following element 
     all[currentIndex + 1].focus(); 
} 
Problemi correlati