2008-11-10 4 views
75

Gibt es einen einfachen Weg zu setzen Sie den Fokus (Eingabecursor) einer Webseite auf das erste Eingabeelement (Textbox, Dropdown-Liste, ...) beim Laden der Seite ohne die ID des Elements zu kennen ?Wie den Fokus auf das erste Eingabeelement in einem HTML-Formular unabhängig von der ID festlegen?

Ich möchte es als ein gemeinsames Skript für alle meine Seiten/Formulare meiner Webanwendung implementieren.

+6

REMARK wenn Form in Seite platziert wird in einer Art und Weise Benutzer nach unten hat Um die Seite nach unten zu scrollen, um das Formular zu sehen, scrollen Sie den Fokus automatisch nach unten, so wie es ein Anker tun würde. Das ist nicht sehr gut, weil der Benutzer, der zu einer solchen Seite gelangt, sofort zur Formularposition scrollen würde. Ich habe auf Safari und FF getestet (IE7 scrollt nicht). –

+0

@Marco_Demaio Meine Webanwendung ist so strukturiert, dass jede Seite ihre Eingabefelder am oberen Rand des Fensters hat. – splattne

+3

Was ist, wenn der Benutzer die Höhe des Browserfensters auf etwas kleiner als 768px änderte? Seite würde zu der Stelle scrollen, auf die Sie den Fokus gesetzt haben. Jedenfalls wollte ich dich nur warnen, falls du von solch einem kleinen Problem nichts wusstest, ich wusste auch nichts davon, bevor ich ein paar Tests machte. –

Antwort

90

Sie auch jQuery basierende Methode ausprobieren können:

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

Es funktioniert! Ich fange an, jQuery in meine Webanwendung zu integrieren. Also, ich denke, ich werde bei diesem Ansatz bleiben! Vielen Dank, Marko! – splattne

+2

Was passiert, wenn das erste Formular auf der Seite in diesem Fall ausgeblendet wird? Oder wenn das erste Element im Formular über CSS ausgeblendet ist? Sicher würde das scheitern. Ich bin natürlich pedantisch, aber so rolle ich. –

+0

In meinem Fall (mit ASP.NET) habe ich nur ein Formular, das nie ausgeblendet wird. Das funktioniert also für mich. – splattne

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

Diese verfeinert werden kann eine Schleife zB mit. nicht bestimmte Arten von Feldern, deaktivierte Felder und so weiter. Besser kann sein, eine Klasse = "Autofokus" zu dem Feld hinzufügen Sie tun wollen konzentrieren, und Schleife über Formulare [i] .elements [j] auf der Suche nach dem Klassennamen.

Jedenfalls: es ist normalerweise keine gute Idee, dies auf jeder Seite zu tun. Wenn Sie eine Eingabe fokussieren, verliert der Benutzer die Fähigkeit, z. Scrolle die Seite von der Tastatur. Wenn dies unerwartet ist, kann dies ärgerlich sein, so dass Sie nur dann Autofokus verwenden, wenn Sie sich ziemlich sicher sind, dass die Verwendung des Formularfelds genau das ist, was der Benutzer tun möchte. dh. wenn du Google bist.

+1

Sollte die richtige Antwort sein, da die Frage kein jquery-Tag hat. –

5

Sie müssen auch versteckte Eingaben überspringen.

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

Ich könnte falsch liegen, aber diese Schleife hat kein definiertes Verhalten, wenn Formulare [0] keine versteckten Eingaben hat. – xtofl

+0

Genau. Es wird verwendet, um alle führenden versteckten Eingaben zu überspringen. Und es wird unter der Annahme geschrieben, dass es nicht verborgene Felder in dem Formular gibt. Ich hätte es auch mit jQuery machen können (ich werde eine andere Antwort posten), aber du hast nicht erwähnt, dass du jQuery involvieren willst. –

+1

@MarkoDumic Warum Speicher verschwenden, wenn Sie eine 'while' Anweisung verwenden können? – Lucio

7

Wenn Sie das Prototype JavaScript-Framework verwenden, dann können Sie die focusFirstElement Methode verwenden:

Form.focusFirstElement(document.forms[0]); 
3

diesen Code am Ende Ihrer body Tag Putting wird das erste sichtbare, nicht verborgen konzentrieren aktiviertes Element auf dem Bildschirm automatisch. Es wird die meisten Fälle behandeln, die ich kurzfristig stellen kann.

<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

Eine Sache, die hier zu beachten ist, ist, dass Elemente gefunden werden können, die nicht selbst versteckt sind, aber ein Vorfahre ist. Das würde eine Verfolgung des DOM und eine Überprüfung der Sichtbarkeit der einzelnen Vorfahren erfordern, was meiner Meinung nach eine ernsthafte Überforderung für diese Art von Situation darstellt. –

+0

Was ist mit Ich denke, Sie sollten einen solchen Fall zu Ihrem Code hinzufügen. Normalerweise möchten sich Benutzer nicht auf ein schreibgeschütztes Eingabefeld konzentrieren. Anyway nice code und +1 danke! –

+0

Ungetestet, aber ich habe es mit! Forms [i] [j] .readonly! = Undefined aktualisiert –

17

Die umfassendste jQuery Ausdruck fand ich Arbeits ist (durch die Hilfe von über here)

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

Ich benutze dies, bemerkte, dass es sehr langsam auf IE läuft, wenn eine große Anzahl> 1000 Checkboxen in einer Tabelle haben. Ich bin mir nicht sicher, was ich dagegen tun soll, ich muss vielleicht einfach das erste Eingabefeld fokussieren. –

118

Obwohl dieses ‚doesn Um die Frage zu beantworten (erfordert ein gemeinsames Skript), könnte es für andere nützlich sein zu wissen, dass HTML5 das Autofokus-Attribut einführt:

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

Dive in to HTML5 hat weitere Informationen.

+2

Autofokus ist der Attributname. Was ist mit seinem Wert? Etwas wie Autofokus = True nicht benötigt? Was bedeutet es, keinen Wert zu setzen? – Geek

+4

In HTML5 müssen einige Attribute keinen Wert haben, "checked" ist ein anderes Attribut, wo dies der Fall ist. Ich glaube, dass, wenn der Wert weggelassen wird, es impliziert wird, dass es derselbe wie der Name ist (z. B. Autofokus = "Autofokus" und überprüft = "geprüft"). –

+0

Meine Spring-App bricht ab, wenn ich 'Autofokus' ohne Wert für' feder: form' verwende. 'Autofokus =" Autofokus "' funktioniert jedoch gut. Danke, @Jacob. –

2

Dies ruft die erste sichtbare Eingabedatei auf, einschließlich Textfelder und Auswahlfelder. Dies stellt auch sicher, dass sie nicht versteckt, deaktiviert oder nur gelesen werden. Es erlaubt auch ein Ziel-Div, das ich in meiner Software verwende (dh erste Eingabe innerhalb dieses Formulars).

2

Ich verwende diese:

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

Mit AngularJS:

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

Dazu gehören Textbereiche und schließt Radiobuttons

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

Für diejenigen, die JSF2 verwenden. 2+ und kann aut nicht passieren ofocus als Attribut ohne Wert zu, verwenden Sie diese:

p:autofocus="true" 

Und es auf den Namespace p hinzuzufügen (auch häufig verwendet, pt. Was immer du magst).

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

Sie sollten client der Lage sein, anstatt für das Anzeigeattribut der Überprüfung zu verwenden, da ein Elternteil versteckt dieses Element werden könnte:

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; 
       } 
      } 
     } 
    } 
}