Come imposto il focus sul primo elemento di input in un modulo HTML indipendente dall'id?


88

Esiste un modo semplice per impostare il focus (cursore di input) di una pagina web sul primo elemento di input (casella di testo, elenco a discesa, ...) al caricamento della pagina senza dover conoscere l'id dell'elemento?

Vorrei implementarlo come uno script comune per tutte le mie pagine / moduli della mia applicazione web.


7
NOTA se il modulo è posizionato in basso nella pagina in un modo che l'utente deve scorrere verso il basso per vedere il modulo, impostando il focus scorrerà automaticamente la pagina verso il basso come farebbe un'ancora. Questo non è molto buono perché l'utente che arriva a tale pagina lo vedrebbe immediatamente scorrere verso il basso fino alla posizione del modulo. Ho provato su Safari e FF (IE7 non esegue lo scorrimento della pagina).
Marco Demaio

@Marco_Demaio La mia web app è strutturata in modo che ogni pagina abbia le sue caselle di input nella parte superiore della finestra.
splattne

3
cosa succede se l'utente ridimensiona l'altezza della finestra del browser a qualcosa di più piccolo di 768px. La pagina scorre fino al punto in cui hai impostato lo stato attivo. Comunque volevo solo avvisarti nel caso non fossi a conoscenza di un problema così piccolo, non lo sapevo neanche io prima di fare alcuni test.
Marco Demaio

Risposte:


97

Puoi anche provare il metodo basato su jQuery:

$(document).ready(function() {
    $('form:first *:input[type!=hidden]:first').focus();
});

Funziona! Sto iniziando a integrare jQuery nella mia applicazione web. Quindi, penso che continuerò con questo approccio! Molte grazie, Marko!
splattne

3
Cosa succede se il primo modulo sulla pagina è nascosto in questo caso? O se il primo elemento del modulo è nascosto tramite CSS? Sicuramente questo fallirebbe. Naturalmente sono pedante, ma è così che mi muovo.
James Hughes,

Nel mio caso (usando ASP.NET) ho solo UN modulo che non è mai nascosto. Quindi questo funziona per me.
splattne

@ James Hughes, puoi scriverlo come funzione e chiamarlo quando ne hai bisogno, e puoi fare eccezioni. Per me questa soluzione ha davvero aiutato.
Luci

questo non funziona per me per qualche motivo. non dovrei vedere un cursore.
Chris

141

Sebbene questo non risponda alla domanda (richiedendo uno script comune), ho pensato che potrebbe essere utile per gli altri sapere che HTML5 introduce l'attributo 'autofocus':

<form>
  <input type="text" name="username" autofocus>
  <input type="password" name="password">
  <input type="submit" value="Login">
</form>

Tuffati in HTML5 ha più informazioni.


2
autofocus è l'attributename. E il suo valore? Qualcosa come l'autofocus = true non è necessario? Cosa significa non impostare alcun valore?
Geek

4
In HTML5, alcuni attributi non devono avere un valore, "verificato" è un altro attributo in questo caso. Credo che quando il valore viene lasciato fuori, è implicito che sia lo stesso del nome (es. Autofocus = "autofocus" e verificato = "verificato").
Jacob Stanley

La mia app Spring si interrompe quando provo a utilizzare autofocussenza alcun valore spring:form. autofocus="autofocus"funziona bene, però. Grazie, @Jacob.
Sergei Tachenov

2
@ Geek L'attributo autofocus, come molti altri, è un tipo di attributo booleano. Ecco perché viene utilizzato solo in modo dichiarativo, non assegnandogli un valore. Vedi maggiori dettagli nelle specifiche w3c: w3.org/TR/html5/infrastructure.html#boolean-attribute
n1kkou

35
document.forms[0].elements[0].focus();

Questo può essere perfezionato usando un ciclo per es. non focalizzare determinati tipi di campo, campi disabilitati e così via. Meglio potrebbe essere quella di aggiungere una class = "autofocus" per il campo che in realtà non vogliono concentrati, e un ciclo su forme [i] .elements [J] alla ricerca di quel className.

Comunque: normalmente non è una buona idea farlo su ogni pagina. Quando focalizzi un input l'utente perde la capacità, ad es. scorrere la pagina dalla tastiera. Se imprevisto, questo può essere fastidioso, quindi autofocus solo quando sei abbastanza sicuro che l'utilizzo del campo del modulo sarà ciò che l'utente desidera fare. cioè. se sei Google.


3
Dovrebbe essere la risposta corretta, perché la domanda non ha tag jquery.
Kalle H. Väravas

@ KalleH.Väravas no, dovrebbe essere sottovalutato perché fa ipotesi che non si trovano da nessuna parte in questione, ad esempio c'è almeno un modulo. Generalmente non funziona.
9ilsdx 9rvj 0lo

18

L'espressione jQuery più completa che ho trovato funzionante è (tramite l'aiuto di qui )

$(document).ready(function() {
    $('input:visible:enabled:first').focus();
});

1
Lo stavo usando, ho notato che funziona molto lentamente su IE quando c'è un numero elevato> 1000 di caselle di controllo in una tabella. Non sono sicuro di cosa fare al riguardo, potrebbe essere necessario rinunciare a concentrarsi sul primo campo di input.
Sam Watkins,



5

Devi anche saltare tutti gli input nascosti.

for (var i = 0; document.forms[0].elements[i].type == 'hidden'; i++);
document.forms[0].elements[i].focus();

Potrei sbagliarmi, ma questo ciclo non ha un comportamento definito se i moduli [0] non ha input nascosti.
xtofl

Esattamente. Viene utilizzato per saltare tutti gli input nascosti iniziali. Ed è scritto presumendo che ci siano campi non nascosti nel modulo. Avrei potuto farlo anche con jQuery (posterò un'altra risposta) ma non hai detto che vuoi coinvolgere jQuery.
Marko Dumic

1
@MarkoDumic Perché sprecare memoria se puoi usare whileun'istruzione?
Lucio

3

L'inserimento di questo codice alla fine del bodytag metterà automaticamente a fuoco il primo elemento abilitato visibile e non nascosto sullo schermo. Gestirà la maggior parte dei casi che riesco a trovare con breve preavviso.

<script>
    (function(){
        var forms = document.forms || [];
        for(var i = 0; i < forms.length; i++){
            for(var j = 0; j < forms[i].length; j++){
                if(!forms[i][j].readonly != undefined && forms[i][j].type != "hidden" && forms[i][j].disabled != true && forms[i][j].style.display != 'none'){
                    forms[i][j].focus();
                    return;
                }
            }
        }
    })();
</script>

1
Una cosa da considerare qui è che può abbinare elementi che non sono nascosti di per sé, ma lo è un antenato. Ciò richiederebbe il monitoraggio del DOM e il test della visibilità di ogni antenato che ritengo sia seriamente eccessivo per questo tipo di situazione.
James Hughes

Che dire di <input type = "text" readonly = "readonly"> Penso che dovresti aggiungere un caso del genere al tuo codice. Normalmente le persone non vogliono concentrarsi su un campo di testo di input di sola lettura. Comunque bel codice e +1 grazie!
Marco Demaio

Non testato ma l'ho aggiornato con! Forms [i] [j] .readonly! = Undefined
James Hughes


3

Sto usando questo:

$("form:first *:input,select,textarea").filter(":not([readonly='readonly']):not([disabled='disabled']):not([type='hidden'])").first().focus();

2

Questo ottiene il primo di qualsiasi input comune visibile, comprese le aree di testo e le caselle di selezione. Questo assicura anche che non siano nascosti, disabilitati o di sola lettura. consente anche un div di destinazione, che utilizzo nel mio software (cioè, il primo input all'interno di questo modulo).

$("input:visible:enabled:not([readonly]),textarea:visible:enabled:not([readonly]),select:visible:enabled:not([readonly])", 
    target).first().focus();

1

Per coloro che usano JSF2.2 + e non possono passare l'autofocus come attributo senza valore, usa questo:

 p:autofocus="true"

E aggiungilo allo spazio dei nomi p (spesso usato anche pt. Qualunque cosa ti piaccia).

<html ... xmlns:p="http://java.sun.com/jsf/passthrough">

1

senza jquery, ad esempio con javascript normale:

document.querySelector('form input:not([type=hidden])').focus()

funziona su Safari ma non su Chrome 75 (aprile 2019)


0

Con AngularJS:

angular.element('#Element')[0].focus();

0

Ciò include le aree di testo ed esclude i pulsanti di opzione

$(document).ready(function() {
    var first_input = $('input[type=text]:visible:enabled:first, textarea:visible:enabled:first')[0];
    if(first_input != undefined){ first_input.focus(); }
});

0

Dovresti essere in grado di utilizzare clientHeight invece di controllare l'attributo di visualizzazione, poiché un genitore potrebbe nascondere questo elemento:

function setFocus() {
    var forms = document.forms || [];
        for (var i = 0; i < forms.length; i++) {
            for (var j = 0; j < forms[i].length; j++) {
            var widget = forms[i][j];
                if ((widget && widget.domNode && widget.domNode.clientHeight > 0) && typeof widget.focus === "function")
                 && (typeof widget.disabled === "undefined" || widget.disabled === false)
                 && (typeof widget.readOnly === "undefined" || widget.readOnly === false)) {
                        widget.focus();
                        break;
                }
            }
        }
    }   
}

0

Senza librerie di terze parti, usa qualcosa come

  const inputElements = parentElement.getElementsByTagName('input')
  if (inputChilds.length > 0) {
    inputChilds.item(0).focus();
  }

Assicurati di considerare tutti i tag degli elementi del modulo, escludi quelli nascosti / disabilitati come in altre risposte e così via.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.