2008-11-10 115 views
75

¿Hay una manera simple de establecer el foco (cursor de entrada) de una página web en el primer elemento de entrada (cuadro de texto, lista desplegable, ...) al cargar la página sin tener que conocer la identificación del elemento ?¿Cómo establecer el foco en el primer elemento de entrada en un formulario HTML independiente del ID?

Me gustaría implementarlo como un script común para todas mis páginas/formularios de mi aplicación web.

+6

OBSERVACIÓN si la forma se coloca en la página de un usuario medio tiene para desplazarse hacia abajo en la página para ver el formulario, al establecer el foco se desplazará automáticamente hacia abajo como lo haría un anclaje. Esto no es muy bueno porque el usuario que accede a dicha página lo vería desplazarse inmediatamente a la posición de formulario. Probé en Safari y FF (IE7 no realiza el desplazamiento de página). –

+0

@Marco_Demaio Mi aplicación web está estructurada de manera que cada página tiene sus cuadros de entrada cerca de la parte superior de la ventana. – splattne

+3

¿Qué sucede si el usuario cambia el tamaño de la altura de la ventana del navegador a algo más pequeño que 768px? La página se desplazará al lugar donde estableces el foco. De todos modos, solo quería advertirte en caso de que no supieras sobre un problema menor, tampoco lo supe antes de hacer algunas pruebas. –

Respuesta

90

También puede intentar método basado en jQuery:

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

¡Funciona! Estoy empezando a integrar jQuery en mi aplicación web. Entonces, ¡creo que me quedaré con este enfoque! Muchas gracias, Marko! – splattne

+2

¿Qué sucede si el primer formulario de la página está oculto en este caso? ¿O si el primer elemento del formulario está oculto a través de CSS? Seguramente esto fallaría. Estoy siendo pedante, por supuesto, pero así es como ruedo. –

+0

En mi caso (usando ASP.NET) tengo solo UN formulario que nunca está oculto. Entonces esto funciona para mí – splattne

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

Esto puede ser refinado utilizando un bucle de ejemplo. no enfoca ciertos tipos de campos, campos desactivados, etc. Mejor puede ser agregar un class = "autofocus" al campo que realmente do quiere enfocar, y recorrer los formularios [i] .elements [j] buscando ese className.

De todos modos: normalmente no es una buena idea hacer esto en cada página. Cuando enfoca una entrada, el usuario pierde la capacidad de, por ejemplo. desplaza la página desde el teclado. Si es inesperado, esto puede ser molesto, por lo que solo enfoque automáticamente cuando esté seguro de que usar el campo de formulario va a ser lo que el usuario quiera hacer. es decir. si eres Google

+1

debería ser la respuesta correcta, porque la pregunta no tiene etiqueta jquery. –

5

También debe omitir las entradas ocultas.

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

Podría estar equivocado, pero este ciclo no tiene un comportamiento definido si los formularios [0] no tienen entradas ocultas. – xtofl

+0

Exactamente. Se usa para omitir cualquier entrada oculta principal. Y está escrito bajo la suposición de que hay campos no ocultos en la forma. Pude haberlo hecho con jQuery también (publicaré otra respuesta) pero no mencionaste que quieres involucrar a jQuery. –

+1

@MarkoDumic ¿Por qué perder memoria si puede usar una declaración 'while'? – Lucio

7

Si está utilizando el marco de JavaScript Prototype continuación, puede utilizar el método de focusFirstElement:

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

Poner este código al final de su etiqueta body se centrará la primera visibles no ocultos, elemento habilitado en la pantalla de forma automática. Se encargará de la mayoría de los casos que se me ocurran con poco tiempo de aviso.

<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 a considerar aquí es que puede coincidir con elementos que no están ocultos, pero sí lo es un antepasado. Eso requeriría hacer un seguimiento del DOM y probar la visibilidad de cada uno de los antepasados, lo cual creo que es una exageración seria para este tipo de situación. –

+0

¿Qué pasa con Creo que debería agregar tal caso a su código. Normalmente las personas no quieren centrarse en un campo de texto de entrada de solo lectura. De todos modos buen código y +1 gracias! –

+0

No comprobado, pero lo actualicé con. Forms [i] [j] .readonly! = Undefined –

17

La expresión más completa jQuery encontré trabajo es (a través de la ayuda de más de here)

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

Estaba usando esto, noté que funciona extremadamente lento en IE cuando tiene un número grande> 1000 de casillas de verificación en una tabla. No estoy seguro de qué hacer al respecto, podría tener que renunciar a enfocar el primer campo de entrada. –

118

Aunque este doesn' Para responder a la pregunta (que requiere una secuencia de comandos común), creo que podría ser útil para otros saber que HTML5 introduce el atributo 'autofocus':

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

Dive in to HTML5 tiene más información.

+2

autofocus es el nombre del atributo. ¿Qué pasa con su valor? ¿Algo así como autofocus = true no es necesario? ¿Qué significa no establecer ningún valor? – Geek

+4

En HTML5, algunos atributos no necesitan tener un valor, 'checked' es otro atributo donde este es el caso. Creo que cuando se deja el valor, se implica que es el mismo que el nombre (por ejemplo, autofocus = "autofocus" y checked = "checked"). –

+0

La aplicación My Spring se rompe cuando trato de usar 'autofocus' sin valor en' spring: form'. 'autofocus =" autofocus "' funciona bien, sin embargo. Gracias, @Jacob. –

2

Esto obtiene la primera de cualquier entrada común visible, incluyendo áreas de texto y cuadros de selección. Esto también asegura que no estén ocultos, deshabilitados o de solo lectura. también permite un div de destino, que uso en mi software (es decir, la primera entrada dentro de este formulario).

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

estoy usando esto:

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

Con AngularJS:

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

Esto incluye áreas de texto y botones de opción excluye

$(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

Para aquellos que utilizan JSF2. 2+ y no puede pasar aut ofocus como un atributo sin valor a la misma, utilice esto:

p:autofocus="true" 

y añadirlo al espacio de nombres p (pt También se utiliza a menudo. Lo que quieras).

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

Usted debe ser capaz de utilizar clientHeight en vez de comprobar para el atributo de visualización, ya que un padre podría estar escondido este 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; 
       } 
      } 
     } 
    } 
} 
Cuestiones relacionadas