Meilleure Pratique: l'Accès à des éléments de formulaire en HTML l'attribut id ou name?
Que tout assaisonné développeur JavaScript sait, il y a beaucoup (trop) de trouver des moyens 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 y a plusieurs façons d'accéder à ce en JavaScript:
[1] document.forms[0].elements[0];
[2] document.myForm.foo;
[3] document.getElementById('foo');
[4] document.getElementById('myForm').foo;
... and so on ...
Méthodes [1] et [3] sont bien documentés dans la Mozilla Gecko de la documentation, mais aucun n'est idéal. [1] est juste trop générales pour être utiles et [3] nécessite à la fois un id et un nom (en supposant que vous serez la publication des données à un serveur côté de la langue). Idéalement, il serait préférable d'avoir seulement un attribut id ou un nom d'attribut (ayant à la fois est un peu redondant, surtout si l'id n'est pas nécessaire pour tout le css, et augmente le risque de fautes de frappe, etc).
[2] semble être le plus intuitif et il semble être largement utilisé, mais je ne l'ai pas vu, il est référencé dans le moteur Gecko de la documentation et je suis inquiet à propos de deux attaquants de la compatibilité et de la croix-compatibilité entre navigateurs (et bien sûr, je veux être comme conforme aux normes du possible).
Alors, quelle est la meilleure pratique ici? Quelqu'un peut-il point à quelque chose dans le DOM de la documentation ou de spécification du W3C qui pourrait résoudre ce problème?
Remarque, je suis particulièrement intéressé par un non-bibliothèque solution (jQuery/Prototype).
- Je suppose que cela se résume à est que je suis à la recherche de la plus conforme aux normes du chemin pour accéder à un élément de formulaire à l'aide de l'attribut de nom de...
- "ayant à la fois est un peu redondant, surtout si l'id n'est pas nécessaire pour tout le css, et augmente le risque de fautes de frappe" -- ID est nécessaire pour une utilisation efficace des étiquettes. Pas seulement CSS.
- Parfois, il y a plusieurs formulaires sur une page web et attributs id peuvent entrer en collision.
Vous devez vous connecter pour publier un commentaire.
Donner à votre formulaire un id seulement, et votre entrée un nom seulement:
Alors la plus conforme aux normes et moins problématique façon d'accéder à votre élément d'entrée est par le biais de:
à l'aide de
.elements["foo"]
au lieu de simplement.foo
est préférable, car ce dernier pourrait retourner une propriété de la forme nommée "toto" plutôt que d'un élément HTML!myform.onsubmit = validateForm;
(où myform est une variable fait référence à la forme de l'élément, et validateForm est le nom de votre fonction de validation... mais vous pouvez l'appeler mafonction si vous vraiment, vraiment vous voulez). Le point important est quevalidateForm()
doit retourner false chaque fois que le formulaire n'est pas valide, ainsi que le champ de problème(s) à l'utilisateur. Il doit retourner true lorsque le formulaire de données valide correctement, ce qui permettra de les soumettre à l'action pour aller de l'avant.id
?aria-*
?id
attributs ainsi quename
attributs. (Généralement, faire lename
etid
même est une bonne règle de base quand on fait cela, mais il n'est pas essentiel... et en particulierid
s doit être unique dans un document, alors que les noms d'élément n'a pas besoin d'être, que ce soit entre les différentes formes, ou même dans la même forme, donc il y a certainement des contre-exemples).id
s sur les éléments de formulaire ne sont pas optimales réponse pour l'OP de la question, qui est pourquoi j'ai dit de ne pas les utiliser. Je ne dis pas que vous devriez jamais utiliser! Si vous avez besoin d'associer une étiquette qui n'est pas celle de l'élément parent, si vous devez choisir un élément spécifique pour le style CSS, ou si vous avez besoin d'un accès rapide à un élément particulier de javascript (par opposition à une manière générale, pour accéder à des éléments de formulaire, qui est ce que la question posée), alors vous devriez aller de l'avant de donner à votre élément de formulaire unid
!"Pas-omg-jamais!" vient à l'esprit quand je vois cette méthode d'accès à l'élément. Le problème, c'est qu'il suppose que le DOM est une réaction normale de la structure de données (par exemple: un tableau) dans laquelle l'élément de commande est statique, cohérentes et fiables dans de toute façon. Nous savons que 99,9999% du temps, que ce n'est pas le cas. La réorganisation ou
input
éléments à l'intérieur de la forme, en ajoutant un autreform
à la page avant que le formulaire en question, ou de déplacer la forme en question sont tous des cas où ce code pauses. En bref: c'est très fragile. Dès que vous ajoutez ou déplacez quelque chose, il va se casser.Je suis avec Sergey Il'Insky sur ce:
id
attribut:document.getElementById("myform");
document.getElementById("myform").foo;
Mon principal problème avec cette méthode est que la
name
attribut est inutile lorsqu'il est appliqué à un formulaire. Le nom n'est pas transmis au serveur en tant que partie de la POST/GET et ne fonctionne pas pour de hachage style de signets.À mon avis, c'est le plus préférable méthode. L'accès Direct est le plus concis et clair méthode.
À mon avis, c'est acceptable, mais plus détaillée que nécessaire. Méthode n ° 3 est préférable.
J'ai donc été de regarder un vidéo de Douglas Crockford et il a pesé sur ce sujet. Le point d'intérêt est à -12:00. Pour résumer:
name
attribut est utilisé pour nommer les choses, de ne pas y avoir accès. C'est pour nommer les choses comme les fenêtres, les champs de saisie, et d'ancrage des balises.Donc là vous l'avez. Sémantiquement, ce qui fait le plus de sens.
document.aForm.foo
fonctionne, mais la spec HTML5 semble clairement définir l'interface d'unHTMLFormElement
qui acaller getter any namedItem(in DOMString name);
. Plus au whatwg.org/specs/web-apps/current-work/multipage/...input
ouselect
, je parle de l'attribut name d'unform
. L'attribut name d'unform
ne pas se passer pour le serveur.Pour accéder nommé éléments placés dans un formulaire, il est une bonne pratique d'utiliser le
form
objet lui-même.Pour accéder à l'arbitraire d'un élément dans l'arborescence DOM qui peuvent à l'occasion être trouvé à l'intérieur d'un formulaire, utilisez
getElementById
et l'élémentid
.Je préfère de beaucoup une 5ème méthode. C'est
[5] Utiliser le JavaScript identificateur ce pour passer de la forme ou de l'objet de champ pour la fonction à partir du gestionnaire d'événement.
Plus précisément, pour les formulaires:
et
À l'aide de cette technique, la fonction n'a jamais à savoir
- l'ordre dans lequel les formes sont définies 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 connaître le nom ou l'id d'un champ de poids, si elle n'a besoin de savoir le nom de la limite de poids de champ.
Ce n'est pas vraiment répondre à votre question, mais juste sur cette partie:
Vous aurez très probablement besoin d'avoir un
id
l'attribut de chaque champ de formulaire, de toute façon, de sorte que vous pouvez associer sa<label>
élément avec elle, comme ceci:Cela est nécessaire pour l'accessibilité (c'est à dire si vous n'associez pas les étiquettes du formulaire et des contrôles, pourquoi détestez-vous les aveugles à ce point?).
C'est un peu redondant, bien que moins quand vous avez des cases à cocher/boutons radio, où plusieurs d'entre eux peuvent partager un
name
. En fin de compte,id
etname
sont à des fins différentes, même si les deux sont souvent réglés à la même valeur.C'est un peu vieux, mais je veux ajouter une chose que je pense est pertinent.
(Je voulais commenter l'un ou 2 fils ci-dessus, mais il semble que j'ai besoin de réputation 50 et je n'ai que 21 ans au moment où j'écris ces lignes. 🙂 )
Je veux juste dire qu'il y a des moments où c'est beaucoup mieux pour accéder aux éléments d'un formulaire par un nom plutôt que par id. Je ne parle pas de la forme elle-même. La forme, OK, vous pouvez lui donner un identifiant et d'y accéder par elle. Mais si vous avez un bouton radio dans un formulaire, il est beaucoup plus facile de l'utiliser comme un objet unique (obtention et définition de sa valeur) et vous ne pouvez le faire que par leur nom, pour autant que je sais.
Exemple:
Vous pouvez obtenir/définir la valeur du bouton radio R1 comme un tout et en utilisant
document.mainForm.R1.valeur
ou
document.getElementById("mainForm").R1.valeur
Donc, si vous voulez avoir un seul style, vous pouvez toujours utiliser cette méthode, quel que soit le type d'élément de formulaire. Moi, je suis parfaitement à l'aise d'accéder boutons radio par nom et zones de texte par id.
Étant à l'ancienne j'ai toujours utilisé le document.myform.myvar' la syntaxe, mais j'ai récemment trouvé échoué dans Chrome (OK sous Firefox et IE). C'était une page Ajax (c'est à dire chargé dans la propriété innerHTML d'un div). Peut-être que Chrome ne reconnaissent pas la forme comme un élément du document principal. J'ai utilisé getElementById (sans faire référence à la forme) à la place et ça a fonctionné.
Forme 2 est ok, et la formule 3 est également recommandé.
La redondance entre le nom et l'id est causée par le besoin de maintenir la compatibilité, sur html 5 de certains éléments (comme img, forme, iframe et autres) vont perdre leur attribut "name", et il est recommandé d'utiliser leur id de référence à partir de maintenant 🙂
Pour compléter les autres réponses, document.myForm.toto est le soi-disant DOM niveau 0, qui est le moyen mis en œuvre par Netscape et n'est donc pas vraiment un standard ouvert, même si elle est prise en charge par la plupart des navigateurs.
Consultez cette page: https://developer.mozilla.org/En/DOM/Document.getElementsByName
Elle doit être "éléments" et doit retourner un tableau, car plus d'un élément peut avoir le même nom.
Ma réponse sera différente sur la question exacte.
Si je veux accéder à un certain élément spécifiquement, puis-je utiliser document.getElementById().
Un exemple est le calcul le nom complet d'une personne, parce que c'est en s'appuyant sur plusieurs domaines, mais il est un modèle de la formule.
Si je veux accéder à l'élément comme faisant partie d'une structure fonctionnelle (une forme), puis-je utiliser:
C'est la façon dont il fonctionne également du point de vue de l'entreprise. Les changements au sein de la boucle aller de pair avec des changements fonctionnels de l'application et sont à cet effet de sens. Je l'applique surtout pour les convivial de la validation et de la prévention des appels de réseau pour la vérification des données erronées. Je le répète, la validation côté serveur (et d'y ajouter un peu plus à elle), mais si je peux aider l'utilisateur côté client, alors c'est que bénéfique pour tous.
Pour l'agrégation de données (comme la construction d'un graphique basé sur les données de la forme) j'utilise des documents de configuration et les objets Javascript. Ensuite c'est le sens exact du champ important par rapport à son contexte et dois-je utiliser document.getElementById().