HTML this form dans les événements onsubmit : le guide du développeur

Quand un formulaire HTML déclenche son événement onsubmit, le mot-clé this peut pointer vers des objets différents selon la manière dont le gestionnaire est attaché. Attribut HTML inline, addEventListener, fonction fléchée : chaque approche modifie la valeur de this et, par extension, la capacité à lire les champs du formulaire ou à bloquer l’envoi. Cet article compare ces comportements, mesure leurs écarts et identifie les pièges concrets que les développeurs rencontrent en production.

Valeur de this selon le mode d’attachement du gestionnaire onsubmit

La confusion autour de this dans un événement onsubmit vient du fait que JavaScript lui attribue une valeur contextuelle, pas une valeur fixe. Le tableau ci-dessous résume ce que this désigne dans chaque cas de figure courant.

A voir aussi : Découvrez le savoir grâce à une encyclopédie collaborative

Mode d’attachement Valeur de this Accès direct aux champs via this.elements
Attribut HTML inline (onsubmit="return validate(this)") L’élément <form> lui-même Oui
form.onsubmit = function() {} L’élément <form> Oui
addEventListener('submit', function() {}) L’élément <form> Oui
addEventListener('submit', () => {}) (fonction fléchée) Le scope englobant (souvent window) Non
Méthode d’une classe avec bind L’objet passé à bind Seulement si bind(formElement)

Le point clé : les fonctions fléchées ne lient jamais this au formulaire. Elles héritent du contexte lexical parent. Dans la majorité des cas, ce parent est le module ou window, ce qui rend this.elements inaccessible.

Développeuse frontend travaillant sur la gestion d'événements de soumission de formulaire HTML dans un espace de coworking

A lire également : Nouvelle URL de xabriv.com : le guide pour retrouver le site

Fonction fléchée contre fonction classique dans onsubmit

Avec une fonction classique passée à addEventListener, le navigateur fixe this sur l’élément cible de l’événement, c’est-à-dire le <form>. Le développeur peut alors appeler this.elements.email.value sans stocker de référence préalable.

Avec une fonction fléchée, this pointe vers le scope englobant. Si le script est dans un module ES, this vaut undefined en mode strict. Si le script est global, this vaut window. Dans les deux cas, tenter this.elements produit une erreur.

La solution la plus fiable quand on utilise des fonctions fléchées : récupérer le formulaire via event.target plutôt que via this. L’objet event passé en paramètre du callback contient toujours la référence correcte, quel que soit le type de fonction.

Quand la fonction fléchée reste pertinente

Dans une classe ou un composant qui gère plusieurs formulaires, la fonction fléchée conserve le this de l’instance. Cela évite d’appeler .bind(this) dans le constructeur. Le compromis : accéder au formulaire via event.target au lieu de this, ce qui reste lisible.

preventDefault et return false dans un formulaire HTML

Bloquer l’envoi d’un formulaire fait partie du quotidien des gestionnaires onsubmit. Deux approches coexistent, mais elles ne se comportent pas de la même façon.

  • event.preventDefault() empêche le comportement par défaut (envoi au serveur) tout en laissant l’événement se propager aux éléments parents. C’est l’approche recommandée avec addEventListener.
  • return false dans un attribut HTML inline (onsubmit="return validate()") annule l’envoi et stoppe la propagation. En revanche, return false dans un callback attaché via addEventListener n’a aucun effet sur la soumission.
  • Un gestionnaire qui lance une exception avant d’atteindre return false ne bloquera pas l’envoi du formulaire. Le serveur recevra des données potentiellement invalides. preventDefault() appelé en début de fonction protège contre ce scénario.

La règle opérationnelle : appeler preventDefault en premier, valider ensuite, soumettre manuellement si tout est correct. Ce schéma élimine le risque qu’une erreur JavaScript laisse passer un envoi non voulu.

Formulaires modaux avec dialog et impact sur this

La balise <dialog>, désormais supportée par tous les navigateurs modernes (Chrome, Firefox, Safari, Edge), a changé la manière dont les formulaires sont affichés dans des fenêtres modales. Avec showModal(), le navigateur gère nativement le focus trap et l’overlay.

Un formulaire placé à l’intérieur d’un <dialog> peut utiliser l’attribut method="dialog". Dans ce cas, la soumission ferme la modale au lieu d’envoyer les données au serveur. L’événement submit est toujours déclenché, et this pointe bien vers le formulaire dans un gestionnaire classique.

Le piège : si le gestionnaire onsubmit appelle event.preventDefault(), la modale ne se ferme pas, car la fermeture est le « comportement par défaut » de method="dialog". Le développeur doit alors appeler dialogElement.close() manuellement après la validation.

Poste de travail développeur avec code HTML formulaire onsubmit affiché sur deux écrans et console DevTools ouverte

Erreurs fréquentes avec this et submit en JavaScript

Appel programmatique via form.submit()

Appeler document.forms["monForm"].submit() depuis un lien ou un bouton externe ne déclenche pas l’événement submit. Le gestionnaire onsubmit n’est jamais exécuté, la validation côté client est contournée. Pour déclencher le cycle complet (validation native, événement, gestionnaire), il faut utiliser form.requestSubmit(), qui simule un clic sur le bouton de soumission.

document.forms versus getElementById

document.forms["form"] accède au formulaire par son attribut name. Si le name est absent, la collection renvoie undefined. Préférer document.getElementById ou une référence directe stockée dans une variable pour éviter des erreurs silencieuses.

Perte de this dans un setTimeout

Envelopper la logique de validation dans un setTimeout à l’intérieur du gestionnaire onsubmit déplace l’exécution hors du contexte synchrone de l’événement. this peut alors pointer vers window même avec une fonction classique, et preventDefault() n’a plus d’effet car l’événement est déjà traité.

Le choix entre attribut inline, addEventListener avec fonction classique ou fonction fléchée dépend de l’architecture du projet. Dans tous les cas, event.target reste la référence la plus stable vers le formulaire, indépendante du mode d’attachement et du contexte d’exécution. Tester systématiquement la valeur de this avec console.log(this) dans le gestionnaire évite la plupart des bugs liés à la soumission de formulaires en JavaScript.

A voir sans faute