Como cualquier desarrollador experimentado de JavaScript sabe, hay muchas (demasiadas) formas de hacer lo mismo. Por ejemplo, supongamos que tiene un campo de texto de la siguiente manera:
<form name="myForm">
<input type="text" name="foo" id="foo" />
Hay muchas formas de acceder a esto en JavaScript:
[1] document.forms[0].elements[0];
[2] document.myForm.foo;
[3] document.getElementById('foo');
[4] document.getElementById('myForm').foo;
... and so on ...
Los métodos [1] y [3] están bien documentados en la documentación de Mozilla Gecko, pero ninguno es ideal. [1] es demasiado general para ser útil y [3] requiere una identificación y un nombre (suponiendo que publicará los datos en un idioma del lado del servidor). Idealmente, sería mejor tener solo un atributo de identificación o un atributo de nombre (tener ambos es algo redundante, especialmente si la identificación no es necesaria para ningún CSS, y aumenta la probabilidad de errores tipográficos, etc.).
[2] parece ser el más intuitivo y parece ser ampliamente utilizado, pero no lo he visto mencionado en la documentación de Gecko y estoy preocupado por la compatibilidad directa y la compatibilidad entre navegadores (y, por supuesto, quiero ser lo más compatible posible con los estándares).
Entonces, ¿cuál es la mejor práctica aquí? ¿Alguien puede señalar algo en la documentación DOM o en la especificación W3C que pueda resolver esto?
Tenga en cuenta que estoy específicamente interesado en una solución que no sea de biblioteca (jQuery / Prototype).
fuente
Respuestas:
Déle a su formulario una identificación solamente, y su entrada solo un nombre :
Entonces, la manera más compatible con los estándares y menos problemática para acceder a su elemento de entrada es a través de:
Es preferible usar en
.elements["foo"]
lugar de solo.foo
porque este último puede devolver una propiedad del formulario llamado "foo" en lugar de un elemento HTML.fuente
myform.onsubmit = validateForm;
(donde myform es una variable que hacen referencia al elemento de formulario, y ValidateForm es el nombre de su función de validación ... pero puede que el nombre myFunc si realmente , realmente quiere ) El punto importante es quevalidateForm()
debe devolver falso siempre que el formulario no sea válido, así como indicar los campos problemáticos al usuario. Debería volver verdadero cuando los datos del formulario se validen correctamente, lo que permitirá que la acción de envío continúe.name
atributo, por lo que puede tener<select name="a+b">
o<input type="text" name="...2">
, a lo que no se puede hacer referencia mediante la notación javascript .propertyName). La notación explícita [] también permite nombres creados a partir de expresiones, por ejemplomyCheckBox = document.getElementById("myform").elements["CHK"+i]
. Además, estilísticamente, creo que [] es mejor, deja en claro que estas no son solo propiedades de un objeto javascript. YMMV.elements
no es un objeto JS normal,elements.foo
oelements["foo"]
se está convirtiendo en elements.namedItem ("foo"). es decir, está llamando a una función definida por DOM , ¡no haciendo referencia a una propiedad JS!" No-omg-never! " Viene a mi mente cuando veo este método de acceso a elementos. El problema con esto es que supone que el DOM es una estructura de datos normal (por ejemplo, una matriz) en la que el orden del elemento es estático, consistente o confiable de todos modos. Sabemos que el 99.9999% de las veces, ese no es el caso. Reordenar o
input
elementos dentro del formulario, agregar otroform
a la página antes del formulario en cuestión o mover el formulario en cuestión son todos los casos en que este código se rompe. Breve historia: esto es muy frágil. Tan pronto como agregue o mueva algo, se romperá.Estoy con Sergey ILinsky en esto:
id
atributo:document.getElementById("myform");
document.getElementById("myform").foo;
Mi principal problema con este método es que el
name
atributo es inútil cuando se aplica a un formulario. El nombre no se pasa al servidor como parte de POST / GET y no funciona para marcadores de estilo hash.En mi opinión, este es el método más preferible. El acceso directo es el método más conciso y claro.
En mi opinión, esto es aceptable, pero más detallado de lo necesario. El método # 3 es preferible.
Por casualidad estaba viendo un video de Douglas Crockford y él intervino en este mismo tema. El punto de interés es a las -12: 00. Para resumir:
name
atributo se usa para nombrar cosas, no para acceder a ellas. Es para nombrar cosas como ventanas, campos de entrada y etiquetas de anclaje.Entonces ahí lo tienes. Semánticamente, esto tiene más sentido.
fuente
document.aForm.foo
funciona, pero la especificación HTML5 parece definir claramente la interfaz de unaHTMLFormElement
que tienecaller getter any namedItem(in DOMString name);
. Más en whatwg.org/specs/web-apps/current-work/multipage/…input
oselect
, estoy hablando del atributo de nombre de aform
. El atributo de nombre de aform
no se pasa al servidor.Para acceder a los elementos con nombre ubicados en un formulario, es una buena práctica usar el
form
objeto en sí.Para acceder a un elemento arbitrario en el árbol DOM que en ocasiones se puede encontrar dentro de un formulario, use
getElementById
y el elementoid
.fuente
Prefiero un quinto método. Es decir
[5] Utilice el identificador especial de JavaScript este para pasar el objeto de formulario o campo a la función de controlador de eventos.
Específicamente, para formularios:
y
Usando esta técnica, la función nunca tiene que saber
: el orden en que se definen los formularios en la página,
- el ID del formulario, ni
- el nombre del formulario
Del mismo modo, para los campos:
y
En este caso, la función nunca tiene que conocer el nombre o la identificación de un campo de peso en particular, aunque sí necesita saber el nombre del campo de límite de peso.
fuente
Realmente no está respondiendo tu pregunta, sino solo en esta parte:
De
id
todos modos, lo más probable es que necesite tener un atributo en cada campo de formulario, de modo que pueda asociar su<label>
elemento con él, así:Esto es necesario para la accesibilidad (es decir, si no asocia etiquetas de formulario y controles, ¿por qué odia tanto a las personas ciegas?).
Es algo redundante, aunque menos cuando tiene casillas de verificación / botones de radio, donde varios de ellos pueden compartir a
name
. En última instancia,id
yname
son para diferentes propósitos, incluso si ambos se establecen a menudo en el mismo valor.fuente
Esto es un poco viejo pero quiero agregar algo que creo que es relevante.
(Tenía la intención de comentar en uno o 2 hilos anteriores, pero parece que necesito reputación 50 y solo tengo 21 en el momento en que escribo esto. :))
Solo quiero decir que hay momentos en que es mucho mejor acceder al elementos de un formulario por nombre en lugar de por id. No estoy hablando de la forma en sí. El formulario, OK, puede asignarle una identificación y luego acceder a él. Pero si tiene un botón de radio en un formulario, es mucho más fácil usarlo como un solo objeto (obtener y establecer su valor) y solo puede hacerlo por nombre, que yo sepa.
Ejemplo:
Puede obtener / establecer el valor marcado del botón de opción R1 en su conjunto mediante
document.mainForm.R1.value
o
document.getElementById ("mainForm"). R1.value
Entonces, si desea tener un estilo unitario, puede desea utilizar siempre este método, independientemente del tipo de elemento de formulario. Yo, estoy perfectamente cómodo accediendo a los botones de radio por nombre y cuadros de texto por id.
fuente
document.forms.mainForm.R1.value
, que de hecho es una buena manera de evitar el uso del tipo feo y tediosodocument.getElementById()
Siendo anticuado, siempre he usado la sintaxis 'document.myform.myvar' pero recientemente encontré que falló en Chrome (OK en Firefox e IE). Era una página Ajax (es decir, cargada en la propiedad innerHTML de un div). Quizás Chrome no reconoció el formulario como un elemento del documento principal. En su lugar, utilicé getElementById (sin hacer referencia al formulario) y funcionó bien.
fuente
.forms
, así quedocument.forms.myform.myvar
Solo para agregar a todo lo que ya se dijo, puede acceder a los
input
mensajes de correo electrónico conname
oid
usando preferiblemente laelements
propiedad del formulario Objeto, porque sin él puede obtener una propiedad del formulario llamado "foo" en lugar de un elemento HTML. Y de acuerdo con @Paul D. Waite, está perfectamente bien tener tanto el nombre como la identificación.De acuerdo con MDN en la página HTMLFormElement.elements
fuente
name
El campo funciona bien. Proporciona una referencia a laelements
.parent.children
- Listará todos los elementos con un campo de nombre del padre.parent.elements
- Listará soloform elements
comoinput-text, text-area, etc
Nota: Para
.elements
trabajar, laparent
necesidad debe ser a<form> tag
. Mientras que,.children
funcionará en cualquieraHTML-element
, como<div>, <span>, etc
.Buena suerte...
fuente
El formulario 2 está bien y también se recomienda el formulario 3.
La redundancia entre el nombre y la identificación es causada por la necesidad de mantener la compatibilidad, en html 5 algunos elementos (como img, form, iframe y demás) perderán su atributo "nombre", y se recomienda usar solo su identificación para hacer referencia a ellos a partir de ahora. en :)
fuente
Para complementar las otras respuestas, document.myForm.foo es el llamado DOM nivel 0, que es la forma implementada por Netscape y, por lo tanto, no es realmente un estándar abierto a pesar de que es compatible con la mayoría de los navegadores.
fuente
Echa un vistazo a esta página: https://developer.mozilla.org/En/DOM/Document.getElementsByName
Tiene que ser 'elementos' y debe devolver una matriz porque más de un elemento podría tener el mismo nombre.
fuente
Mi respuesta diferirá en la pregunta exacta. Si quiero acceder a un determinado elemento específicamente, entonces usaré document.getElementById (). Un ejemplo es calcular el nombre completo de una persona, porque se basa en múltiples campos, pero es una fórmula repetible.
Si quiero acceder al elemento como parte de una estructura funcional (un formulario), entonces usaré:
Así es como también funciona desde la perspectiva del negocio. Los cambios dentro del ciclo van junto con los cambios funcionales en la aplicación y, por lo tanto, son significativos. Lo aplico principalmente para una validación fácil de usar y para evitar llamadas de red para verificar datos incorrectos. Repito el lado del servidor de validación (y agrego un poco más), pero si puedo ayudar al lado del cliente, entonces eso es beneficioso para todos.
Para la agregación de datos (como construir un gráfico circular basado en datos en el formulario), uso documentos de configuración y objetos Javascript personalizados. Entonces, el significado exacto del campo es importante en relación con su contexto y utilizo document.getElementById ().
fuente
Porque el caso [2]
document.myForm.foo
es un dialecto de Internet Exploere. Entonces, en lugar de eso, prefierodocument.forms.myForm.elements.foo
odocument.forms["myForm"].elements["foo"]
.fuente
Prefiero éste
fuente