Comment écouter l'événement de soumission de formulaire en javascript?

124

Je veux écrire ma propre bibliothèque javascript de validation de formulaire et j'ai cherché sur google comment détecter si un bouton d'envoi était cliqué, mais tout ce que j'ai trouvé, c'est du code où vous devez utiliser onClick onSubmit="function()"en html.

Je voudrais faire ce javascript pour ne pas avoir à toucher à un code html comme l'ajout de javascript onSubmit ou onClick.

ed1t
la source
8
Pourquoi pas document.forms['yourForm'].onsubmit = function(){}? Ou addEventListener?
Joseph Silber
3
Voulez-vous vraiment vérifier si le bouton d'envoi a été cliqué ou voulez-vous vérifier quand l'utilisateur soumet le formulaire (ce qu'il peut faire en cliquant sur le bouton ou en appuyant sur Entrée à partir de l'un des champs)?
nnnnnn

Réponses:

506

Pourquoi les gens utilisent-ils toujours jQuery quand ce n'est pas nécessaire?
Pourquoi les gens ne peuvent-ils pas simplement utiliser du JavaScript simple?

var ele = /*Your Form Element*/;
if(ele.addEventListener){
    ele.addEventListener("submit", callback, false);  //Modern browsers
}else if(ele.attachEvent){
    ele.attachEvent('onsubmit', callback);            //Old IE
}

callback est une fonction que vous souhaitez appeler lorsque le formulaire est soumis.

À propos de EventTarget.addEventListener, consultez cette documentation sur MDN .

Pour annuler l' submitévénement natif (empêcher l'envoi du formulaire), utilisez .preventDefault()dans votre fonction de rappel,

document.querySelector("#myForm").addEventListener("submit", function(e){
    if(!isValid){
        e.preventDefault();    //stop form from submitting
    }
});

Écouter l' submitévénement avec les bibliothèques

Si, pour une raison quelconque, vous avez décidé qu'une bibliothèque est nécessaire (vous en utilisez déjà une ou vous ne voulez pas gérer les problèmes entre navigateurs), voici une liste de façons d'écouter l'événement de soumission dans les bibliothèques courantes:

  1. jQuery

    $(ele).submit(callback);

    eleest la référence de l'élément de formulaire et callbackla référence de la fonction de rappel. Référence

  1. AngularJS (1.x)

    <form ng-submit="callback()">
    
    $scope.callback = function(){ /*...*/ };

    Très simple, où $scopeest la portée fournie par le cadre à l'intérieur de votre contrôleur . Référence

  2. Réagir

    <form onSubmit={this.handleSubmit}>
    
    class YourComponent extends Component {
        // stuff
    
        handleSubmit(event) {
            // do whatever you need here
    
            // if you need to stop the submit event and 
            // perform/dispatch your own actions
            event.preventDefault();
        }
    
        // more stuff
    }

    Passez simplement un gestionnaire à l' onSubmitaccessoire. Référence

  3. Autres frameworks / bibliothèques

    Reportez-vous à la documentation de votre framework.


Validation

Vous pouvez toujours faire votre validation en JavaScript, mais avec HTML5, nous avons également une validation native.

<!-- Must be a 5 digit number -->
<input type="number" required pattern="\d{5}">

Vous n'avez même pas besoin de JavaScript! Chaque fois que la validation native n'est pas prise en charge, vous pouvez utiliser un validateur JavaScript.

Démo: http://jsfiddle.net/DerekL/L23wmo1L/

Derek 朕 會 功夫
la source
106
Ces 5 lignes de code "horrible ... laid" remplacent la fonctionnalité requise fournie par 4 000 lignes de jQuery, qui doivent aussi être du code "horrible ... laid".
RobG le
45
Je n'ai pas grand-chose contre jQuery, seulement ceux qui l'utilisent comme une sorte d'incantation magique sans se rendre compte qu'ils peuvent remplacer le tout par quelques lignes de code. Pourquoi ne pas prendre le temps de découvrir comment fonctionnent réellement les navigateurs? Ce n'est vraiment pas si difficile.
RobG le
4
@Ben - et ce n'est pas parce que vous pouvez faire quelque chose avec une bibliothèque que vous devriez le faire non plus, et que les autres ne devraient pas non plus être dissuadés d'apprendre les bases par des réponses "juste utiliser la bibliothèque x". Quand quelqu'un pose une question spécifique sur javascript, il est poli de répondre à la question en utilisant du javascript simple. Bien sûr, suggérez quelque chose de votre bibliothèque de choix, mais répondre à la question devrait être la première priorité.
RobG le
4
Personnellement, je crois qu'une personne doit d'abord connaître les bases.
Derek 朕 會 功夫
7
dans le même esprit, nous devrions vraiment essayer d'écrire plus de langage d'assemblage. À moitié blague (je préfère plutôt une solution jquery et pense que c'est un terrier de lapin sans fin si vous voulez vraiment comprendre ce qui se passe sous le capot), mais oui, je suis heureux de connaître un langage d'assemblage et de savoir comment le TCP des connexions sont faites, etc. Je ne donnerais toujours à personne une solution de niveau inférieur juste pour leur apprendre les merveilles de ce qui est sous le capot.
Josh Sutterfield
6

C'est le moyen le plus simple de faire appel à votre propre fonction javascript lorsqu'un onSubmitfichier.

HTML

<form>
    <input type="text" name="name">
    <input type="submit" name="submit">
</form>

JavaScript

window.onload = function() {
    var form = document.querySelector("form");
    form.onsubmit = submitted.bind(form);
}

function submitted(event) {
    event.preventDefault();
}
Derek Dawson
la source
3
Pourquoi avez-vous décidé de lier la fonction «soumis»? Il n'y a pas d'utilisation de «ceci» dans la fonction.
Lior
bindest en effet inutile.
pstadler le
3

En fonction de vos besoins, vous pouvez également effectuer les opérations suivantes sans bibliothèques telles que jQuery:

Ajoutez ceci à votre tête:

window.onload = function () {
    document.getElementById("frmSubmit").onsubmit = function onSubmit(form) {
        var isValid = true;
        //validate your elems here
        isValid = false;

        if (!isValid) {
            alert("Please check your fields!");
            return false;
        }
        else {
            //you are good to go
            return true;
        }
    }
}

Et votre formulaire peut toujours ressembler à quelque chose comme:

    <form id="frmSubmit" action="/Submit">
        <input type="submit" value="Submit" />
    </form>
fakedob
la source
9
utilisez toujours à la addEventListenerplace de onsubmit ou onload pour permettre aux autres développeurs d'ajouter leurs propres écouteurs.
beytarovski
0

Avec jQuery:

$('form').submit(function () {
    // Validate here

    if (pass)
        return true;
    else
        return false;
});
Justin808
la source