JS (3/5) — Formulaire
Objectif pour le projet
Savoir gérer des formulaires plus ou moins complexes
Être capable d'attacher des comportements au formulaire, notamment à une adresse mail
Cours
Généricité
Les formulaires et les éléments de contrôle d'une page comme <input>
ont de nombreuses propriétés et évènements propres. Il appartiennent à une collection nommée et ordonnée, appelée document.forms
. Vous pouvez donc y accéder de deux manières :
Pour un formulaire forms[x]
donné, tous ses éléments sont accessibles simplement grâce à form.elements
, qui est également une collection nommée et ordonnée.
Attention, il se peut que plusieurs éléments d'un formulaire porte le même nom (e.g. dans le cas de radio buttons). Dans ce cas là, form.elements[name]
est une collection.
Chaque élément element
d'un formulaire fait référence au formulaire qui le contient via element.form
.
En fonction des éléments, les attributs disponibles varies. Par exemple, pour les éléments de type input
et textfield
, vous pouvez directement modifier leur valeur via input.value = "newValue";
et mytextFiled.value = "new value";
. Pour la liste des détails, aller voir sur les documentations MDN et W3School.
Gérer les évènements propre à un formulaire
En général, lors d'un formulaire, il est intéressant d'avoir recourt à du JS pour rajouter de l'intéractivité sur la page, ainsi que des contrôles -- ces derniers permettent de décharger le serveur.
Votre serveur DOIT TOUJOURS, TOUJOURS vérifier les données reçues, même si votre client les vérifie également. En effet, JS peut être contourné facilement et des données fausses/malicieuses peuvent être injectées facilement (cf. challenges de sécurité Web client sur root-me).
Trois évènements nous intéresses ici : le change
, l'input
et le submit
.
change
est émis lorsqu'un élément a terminé d'être modifié. Par exemple pour les champs de texte, c'est dès qu'ils perdent le focus, pour les sélecteur, dès qu'une nouvelle valeur est choisie. Pour capturer le changement, on peut attacher à l'élément en question le handlerchange
:myElement.addEventListener("change", myfunction);
input
est émis à chaque fois que la valeur est modifiée par l'utilisateur, que ce soit une frappe clavier, un copier coller, un text to speach (T2S), etc. De la même manière que change, on l'utilise via l'handler :myElement.addEventListener("input", myfunction);
Le cas de submit Submit est émis lorsqu'un formulaire est envoyé (submitted), généralement par l'entremise d'un bouton <button type="submit" value="Submit">
dans le code HTML ou d'un appuie sur Entrée dans un des champs du formulaire. C'est à ce moment là où on peut vérifier les informations ; si une erreur est présente, appeler la fonction myevent.preventDefault()
dans le handler de soumission permet d'empecher l'envoie au serveur : pratique ! On écoute le formulaire, et non pas le bouton qui fait office de submit.
Exemple :
Il est également possible de submit manuellement un formulaire en JS grâce à la méthode form.submit()
. À noter qu'en effectuant un appel manuel à submit
, l'évènement associé n'est pas généré !
Un peu d'UX
Étant particulièrement fainéant, j'apprécie pouvoir naviguer sur mon site sans une souris. Vous avez la possibilité de savoir quel élément possède le focus actuellement sur votre page, et à quel moment l'élément perd se focus (focusout
), ainsi que quand un élément à la focus (focusin
).
À partir de là, vous pouvez forcer des éléments à avoir le focus, et aussi vous assurer que des champs sont correctement remplis au moment d'un focusout
.
Toutefois, je vous conseille maintenant d'utiliser l'attribut required
et pattern
HTML !
Pour ordonner l'ordre des tabulations, vous pouvez utiliser l'attribut HTML tabindex
. Par exemple :
Qui va du plus petit au plus grand, et qui permet également à des éléments HTML de devenir focusable (par exemple les ul
et li
).
REGEXP
Les expressions régulières (REGEX, REGEXP) sont un moyen synthétique pour appliquer des filtrages à grand échelle. Ils sont très utiles pour les formulaires et la vérification de données, mais sont de prime abord très obscur. Vous avez de très bon tuto sur internet, par exemple celui là.
Surtout, lorsque vous pratiquez les REGEXP, munissez vous d'un interpréteur capable de vous résumer ce que vous êtes en train d'écrire. Un très bon outil : regex101.
Exercice
En reprenant le code précédent que vous avez écrit précédement (Manipulation du Document Object Model), nous voulons maintenant pouvoir modifier directement le commentaire avec du vrai contenu, par exemple si jamais l'on y décèle une faute d'orthographe.
Pour cela, vous aurez besoin d'un formulaire pour écrire le texte, et l'envoyer au serveur (pour le moment, on fera comme si). Ce formulaire n'apparaîtra que lorsque l'on clique sur un des boutons "Modifier".
Rajouter après le bouton
addNew
un formulairemyForm
composé de deux éléments : un textarea (attention, le contenu s'écrit entre les deux balises textarea...) et un input de type submit.Lorsqu'un utilisateur clique sur un bouton "Modifier", le contenu du
textarea
se met à jour avec le commentaire.Lorsque l'utilisateur soumet son formulaire, vérifiez si le commentaire est valide. Un commentaire valide peut par exemple être un commentaire non nul. Si le commentaire est invalide, vous ne devez pas envoyer votre formulaire au serveur -- vous pouvez notifier l'utilisateur que la saisie n'est pas bonne.
Si le commentaire modifié est valide, indiquez quel user est concerné via une fenêtre alerte, puis n'oubliez pas de mettre à jour le commentaire dans la section commentaire.
On veut maintenant cacher ce formulaire tant que l'utilisateur n'a pas cliqué sur un des boutons "Modifier". Jouer avec la bonne propriété CSS pour cacher/afficher.
Pour vous prémunir de tout soucis lorsque le formulaire est caché, désactivez aussi l'élement
input
avec l'attributdisabled
; vous le réactiverez manuellement lorsqu'il sera affiché pour modifier un élément.
Last updated
Was this helpful?