Un formulaire est susceptible de contenir plusieurs boutons, par exemple dans le cas d’un formulaire sur plusieurs étapes avec un bouton prev, un bouton next pour naviguer d’une étape à l’autre et un bouton submit pour soumettre le formulaire.
Si on passe par une validation des champs étape par étape (les champs doivent être correctement renseignés sur une étape donnée avant de pouvoir passer à la suivante) et qu’on utilise (par exemple), le plug-in Abide de Foundation 6 for sites, la présence de l’attribut type="submit">
est obligatoire sur les boutons prev et next pour valider les champs saisis à l’étape en cours avant de pouvoir accéder à la suivante.
Problème: cette présence obligatoire de l’attribut type="submit">
sur les boutons prev et next a pour fâcheux résultat de soumettre le formulaire au clic sur ces derniers.
Solution: intercepter l’événement submit
avec la méthode .bind()
.
1 2 3 4 5 |
// By default, intercept submit event jQuery('form[id*="survey"]').bind('submit', function(e){ e.preventDefault(); return false; }); |
Ce code aura pour effet d’annuler la soumission du formulaire sur tous les boutons de celui-ci. Ce n’est pas tout-à-fait ce que l’on souhaite puisqu’arrivé à la fin de notre formulaire, il faut pouvoir soumettre les données.
Pour ce faire, on va commencer par masquer le vrai bouton de soumission :
1 |
jQuery('form[id*="survey"] p.normal:last-of-type input[type="submit"]').css('display', 'none'); |
On va ensuite créer un faux bouton à l’aide d’un élément a
(qui ne pourra rien soumettre) :
1 |
jQuery('<a id="triggerSubmitButton" class="button" style="display: none;">Enregistrer (a)</a>').appendTo('form[id*="survey"] p.normal:last-of-type'); |
Puis, au moment ou on souhaite laisser la possibilité à l’utilisateur de soumettre, on lance au clic sur notre faux bouton un .unbind()
de l’événement submit
et et un trigger-click sur le vrai bouton de soumission (qui reste toujours masqué) :
1 2 3 4 5 6 |
jQuery('#triggerSubmitButton').on('click', function(){ // Unbind intercept submit event jQuery('form[id*="survey"]').unbind('submit'); // Click (hidden) real submit button jQuery('form[id*="survey"] p.normal:last-of-type input[type="submit"]').click(); }); |
L’intérêt de cette solution réside dans le fait qu’on continue d’empêcher les boutons prev et next d’envoyer le formulaire, ce qui se produirait à la dernière étape si on unbindait l’événement submit
sur l’ensemble des boutons et que l’utilisateur décidait, au lieu de soumettre, de repasser à l’étape précédente.