Comme le sait tout développeur JavaScript chevronné, il existe de nombreuses (trop nombreuses) façons de faire la même chose. Par exemple, disons que vous avez un champ de texte comme suit:
<form name="myForm">
<input type="text" name="foo" id="foo" />
Il existe de nombreuses façons d'y accéder en JavaScript:
[1] document.forms[0].elements[0];
[2] document.myForm.foo;
[3] document.getElementById('foo');
[4] document.getElementById('myForm').foo;
... and so on ...
Les méthodes [1] et [3] sont bien documentées dans la documentation de Mozilla Gecko, mais aucune n'est idéale. [1] est tout simplement trop général pour être utile et [3] nécessite à la fois un identifiant et un nom (en supposant que vous afficherez les données dans un langage côté serveur). Idéalement, il serait préférable de n'avoir qu'un attribut id ou un attribut name (avoir les deux est quelque peu redondant, surtout si l'id n'est pas nécessaire pour un css, et augmente la probabilité de fautes de frappe, etc.).
[2] semble être le plus intuitif et il semble être largement utilisé, mais je ne l'ai pas vu référencé dans la documentation de Gecko et je m'inquiète à la fois de la compatibilité ascendante et de la compatibilité entre navigateurs (et bien sûr je veux être conforme aux normes).
Alors, quelle est la meilleure pratique ici? Quelqu'un peut-il indiquer quelque chose dans la documentation DOM ou dans la spécification W3C qui pourrait résoudre ce problème?
Remarque Je suis spécifiquement intéressé par une solution non-bibliothèque (jQuery / Prototype).
la source
Réponses:
Donnez à votre formulaire un identifiant uniquement et votre entrée un nom uniquement:
Ensuite, le moyen le plus conforme aux normes et le moins problématique d'accéder à votre élément d'entrée est via:
utiliser
.elements["foo"]
plutôt que juste.foo
est préférable car ce dernier peut renvoyer une propriété de la forme nommée "foo" plutôt qu'un élément HTML!la source
myform.onsubmit = validateForm;
(où myform est une variable qui appelle l'élément de forme, et valideFormulaire est le nom de votre fonction de validation ... mais vous pouvez le nommer myFunc si vous vraiment , vraiment voulez ). Le point important est devalidateForm()
renvoyer false chaque fois que le formulaire n'est pas valide, ainsi que d'indiquer le (s) champ (s) de problème à l'utilisateur. Il doit renvoyer true lorsque les données du formulaire sont validées correctement, ce qui permettra à l'action d'envoi de se poursuivre.name
attribut, donc par exemple, vous pouvez avoir<select name="a+b">
ou<input type="text" name="...2">
, qui ne peut pas être référencé en utilisant la notation javascript .propertyName). La notation explicite [] permet également de créer des noms à partir d'expressions, par exemplemyCheckBox = document.getElementById("myform").elements["CHK"+i]
. De plus, stylistiquement, je pense que [] est mieux - cela montre clairement que ce ne sont pas seulement les propriétés d'un objet javascript. YMMV.elements
n'est pas un objet JS normal, etelements.foo
ouelements["foo"]
est en train d'être converti en elements.namedItem ("foo"). c'est-à-dire que vous appelez une fonction définie par DOM , sans faire référence à une propriété JS!" No-omg-never! " Me vient à l'esprit quand je vois cette méthode d'accès aux éléments. Le problème avec ceci est que cela suppose que le DOM est une structure de données normale (par exemple: un tableau) dans laquelle l'ordre des éléments est statique, cohérent ou fiable de toute façon. Nous savons que 99,9999% du temps, que ce n'est pas le cas. Réorganiser des
input
éléments dans le formulaire, en ajouter un autreform
à la page avant le formulaire en question ou déplacer le formulaire en question sont tous les cas où ce code se brise. Petite histoire: c'est très fragile. Dès que vous ajoutez ou déplacez quelque chose, il se cassera.Je suis avec Sergey ILinsky à ce sujet:
id
attribut:document.getElementById("myform");
document.getElementById("myform").foo;
Mon principal problème avec cette méthode est que l'
name
attribut est inutile lorsqu'il est appliqué à un formulaire. Le nom n'est pas transmis au serveur dans le cadre du POST / GET et ne fonctionne pas pour les signets de style de hachage.À mon avis, c'est la méthode la plus préférable. L'accès direct est la méthode la plus concise et la plus claire.
À mon avis, c'est acceptable, mais plus verbeux que nécessaire. La méthode n ° 3 est préférable.
Il se trouve que j'ai regardé une vidéo de Douglas Crockford et il a pesé sur ce sujet même. Le point d'intérêt est à -12: 00. Résumer:
name
attribut est utilisé pour nommer les choses, pas pour y accéder. Il sert à nommer des éléments tels que les fenêtres, les champs d'entrée et les balises d'ancrage.Alors là vous l'avez. Sémantiquement, c'est ce qui a le plus de sens.
la source
document.aForm.foo
fonctionnement, mais la spécification HTML5 semble définir clairement l'interface d'unHTMLFormElement
qui acaller getter any namedItem(in DOMString name);
. Plus d'informations sur whatwg.org/specs/web-apps/current-work/multipage/…input
orselect
, je parle de l'attribut name d'unform
. L'attribut de nom de aform
n'est pas transmis au serveur.Pour accéder aux éléments nommés placés dans un formulaire, il est recommandé d'utiliser l'
form
objet lui-même.Pour accéder à un élément arbitraire de l'arborescence DOM qui peut parfois se trouver dans un formulaire, utilisez
getElementById
et l'élémentid
.la source
Je préfère de loin une 5ème méthode. C'est-à-dire
[5] Utilisez l'identifiant JavaScript spécial this pour transmettre le formulaire ou l'objet champ à la fonction à partir du gestionnaire d'événements.
Plus précisément, pour les formulaires:
et
En utilisant cette technique, la fonction n'a jamais à connaître
- l'ordre dans lequel les formulaires sont définis dans la page,
- l'ID du formulaire, ni
- le nom du formulaire
De même, pour les champs:
et
Dans ce cas, la fonction n'a jamais besoin de connaître le nom ou l'identifiant d'un champ de poids particulier, bien qu'elle ait besoin de connaître le nom du champ de limite de poids.
la source
Cela ne répond pas vraiment à votre question, mais juste sur cette partie:
Vous aurez très probablement besoin d'avoir un
id
attribut sur chaque champ de formulaire de toute façon, afin que vous puissiez y associer son<label>
élément, comme ceci:Ceci est nécessaire pour l'accessibilité (c'est-à-dire si vous n'associez pas les étiquettes de formulaire et les contrôles, pourquoi détestez-vous tant les aveugles?).
C'est quelque peu redondant, bien que moins lorsque vous avez des cases à cocher / boutons radio, où plusieurs d'entre eux peuvent partager un fichier
name
. En fin de compte,id
etname
sont à des fins différentes, même si les deux sont souvent définis sur la même valeur.la source
C'est un peu vieux mais je veux ajouter une chose que je pense pertinente.
(Je voulais faire des commentaires sur un ou 2 fils ci-dessus mais il semble que j'ai besoin d'une réputation de 50 et je n'en ai que 21 au moment où j'écris ceci. :))
Je veux juste dire qu'il y a des moments où il est beaucoup mieux d'accéder au éléments d'un formulaire par nom plutôt que par id. Je ne parle pas du formulaire lui-même. Le formulaire, OK, vous pouvez lui donner un identifiant et y accéder ensuite. Mais si vous avez un bouton radio dans un formulaire, il est beaucoup plus facile de l'utiliser comme un objet unique (obtenir et définir sa valeur) et vous ne pouvez le faire que par son nom, pour autant que je sache.
Exemple:
Vous pouvez obtenir / définir la valeur cochée du bouton radio R1 dans son ensemble en utilisant
document.mainForm.R1.value
ou
document.getElementById ("mainForm"). R1.value
Donc, si vous voulez avoir un style unitaire, vous pouvez souhaitez toujours utiliser cette méthode, quel que soit le type d'élément de formulaire. Moi, je suis parfaitement à l'aise pour accéder aux boutons radio par nom et aux zones de texte par identifiant.
la source
document.forms.mainForm.R1.value
, c'est en effet un bon moyen d'éviter d'utiliser le moche et fastidieux à taperdocument.getElementById()
Étant démodé, j'ai toujours utilisé la syntaxe 'document.myform.myvar' mais j'ai récemment trouvé qu'elle échouait dans Chrome (OK dans Firefox et IE). C'était une page Ajax (c'est-à-dire chargée dans la propriété innerHTML d'un div). Peut-être que Chrome n'a pas reconnu le formulaire comme un élément du document principal. J'ai utilisé getElementById (sans référencer le formulaire) à la place et cela a fonctionné correctement.
la source
.forms
, alorsdocument.forms.myform.myvar
Juste pour ajouter à tout ce qui a déjà été dit, vous pouvez accéder au
input
s soit avec le,name
soit enid
utilisant de préférence laelements
propriété du formulaire Object, car sans cela, vous pouvez obtenir une propriété du formulaire nommée "foo" plutôt qu'un élément HTML. Et selon @Paul D. Waite, il est parfaitement normal d'avoir à la fois le nom et l'identifiant.Selon MDN sur la page HTMLFormElement.elements
la source
name
le terrain fonctionne bien. Il fournit une référence auelements
.parent.children
- Liste tous les éléments avec un champ de nom du parent.parent.elements
- Ne listeraform elements
queinput-text, text-area, etc
Remarque:
.elements
pour fonctionner, leparent
doit être un fichier<form> tag
. Alors que,.children
fonctionnera sur n'importe quelHTML-element
- comme<div>, <span>, etc
.Bonne chance...
la source
La forme 2 est correcte et la forme 3 est également recommandée.
La redondance entre le nom et l'identifiant est causée par la nécessité de garder la compatibilité, sur html 5 certains éléments (comme img, form, iframe et autres) perdront leur attribut "name", et il est recommandé de n'utiliser que leur identifiant pour les référencer à partir de maintenant sur :)
la source
Pour compléter les autres réponses, document.myForm.foo est le soi-disant niveau DOM 0, qui est la manière implémentée par Netscape et n'est donc pas vraiment un standard ouvert même s'il est pris en charge par la plupart des navigateurs.
la source
Consultez cette page: https://developer.mozilla.org/En/DOM/Document.getElementsByName
Il doit s'agir d'éléments et doit renvoyer un tableau car plusieurs éléments peuvent avoir le même nom.
la source
Ma réponse sera différente sur la question exacte. Si je veux accéder spécifiquement à un certain élément, j'utiliserai document.getElementById (). Un exemple est le calcul du nom complet d'une personne, car il s'appuie sur plusieurs champs, mais c'est une formule répétable.
Si je souhaite accéder à l'élément dans le cadre d'une structure fonctionnelle (un formulaire), je vais utiliser:
C'est ainsi que cela fonctionne également du point de vue de l'entreprise. Les changements dans la boucle s'accompagnent de changements fonctionnels dans l'application et sont donc significatifs. Je l'applique principalement pour une validation conviviale et pour empêcher les appels réseau pour vérifier des données erronées. Je répète le côté serveur de validation (et j'y ajoute un peu plus), mais si je peux aider l'utilisateur côté client, alors est-ce bénéfique pour tous.
Pour l'agrégation de données (comme la création d'un graphique à secteurs basé sur les données du formulaire), j'utilise des documents de configuration et des objets Javascript personnalisés. La signification exacte du champ est alors importante par rapport à son contexte et est-ce que j'utilise document.getElementById ().
la source
Parce que le cas [2]
document.myForm.foo
est un dialecte d'Internet Exploere. Alors au lieu de cela, je préfèredocument.forms.myForm.elements.foo
oudocument.forms["myForm"].elements["foo"]
.la source
Je préfère celui-ci
la source