123 votes

Comment puis-je obtenir le bouton qui a provoqué l'envoi à partir de l'événement de soumission du formulaire ?

J'essaie de trouver la valeur du bouton d'envoi qui a déclenché l'envoi du formulaire.

$("form").submit(function() {

});

Je pourrais éventuellement déclencher un événement $("input[type=submit]").click() pour chaque bouton et définir une variable, mais cela semble moins élégant que de retirer le bouton du formulaire lors de l'envoi.

2 votes

Notez qu'il n'existe pas nécessairement de bouton de ce type. Un script pourrait faire formobj.submit() . Je pense que les événements à cliquer sont la voie à suivre.

1 votes

Pour les navigateurs modernes, il existe maintenant event.submitter qui vous donne le <button> o <input type="submit"> qui a été cliqué.

0 votes

event.originalEvent.submitter

115voto

Boldewyn Points 29961

J'ai exploité document.activeElement comme indiqué dans cette réponse : Comment obtenir l'élément focalisé avec jQuery ?

$form.on('submit', function() {
    var $btn = $(document.activeElement);

    if (
        /* there is an activeElement at all */
        $btn.length &&

        /* it's a child of the form */ 
        $form.has($btn) &&

        /* it's really a submit element */
        $btn.is('button[type="submit"], input[type="submit"], input[type="image"]') &&

        /* it has a "name" attribute */
        $btn.is('[name]')
    ) {
        console.log("Seems, that this element was clicked:", $btn);
        /* access $btn.attr("name") and $btn.val() for data */
    }
});

Je tire parti du fait que le bouton est toujours l'élément ciblé après avoir cliqué dessus. Cela permet no travail, si vous faites un blur() juste après le clic.

@Doin a repéré un autre inconvénient. Si un utilisateur soumet le formulaire via enter dans un champ de texte, le document.activeElement n'est pas défini. Vous devez faire attention à cela vous-même, en manipulant la fonction keypress événements en input[type="text"] et similaires.

Mise à jour 2017-01 : Pour ma bibliothèque Hyperform J'ai choisi de ne pas utiliser activeElement mais pour attraper tous les événements, qui mènent à la soumission du formulaire. Le code pour cette est sur Github.

Si vous utilisez Hyperform, voici comment accéder au bouton qui déclenche l'envoi :

$(form).on('submit', function(event) {
  var button = event.submittedVia;
});

0 votes

Excellente solution. J'espère qu'elle sera compatible avec tous les navigateurs.

1 votes

MDN dit oui. (FF3, IE4, Chrome 2, Safari 4, Opera 9)

1 votes

Cela devrait être la réponse.

33voto

hunter Points 33850

J'ai mis en place cette solution et je suppose qu'elle fera l'affaire.

$(document).ready(function() {
    $("form").submit(function() { 

    var val = $("input[type=submit][clicked=true]").val()

    // DO WORK

});

et voici l'événement du bouton de soumission qui le met en place

$("form input[type=submit]").click(function() {
    $("input[type=submit]", $(this).parents("form")).removeAttr("clicked");
    $(this).attr("clicked", "true");
});

Merci pour les réponses, mais ce n'est pas terriblement inélégant...

1 votes

Non compatible avec les navigateurs multiples et les boutons d'envoi multiples.

2 votes

Est-il garanti que l'événement de clic soit déclenché avant l'événement de soumission du formulaire ? Je suggère de donner au formulaire un doNotSubmit dans la fonction de soumission, vérifiez si la classe n'existe pas (sinon ne soumettez pas), dans l'événement de clic, supprimez la classe du formulaire. doNotSubmit et faire un $(''.myForm').trigger('submit') ; après avoir ajouté la valeur du bouton submit comme champ caché

2 votes

@Hafenkranich En de rares occasions sur Chrome, l'événement de clic est déclenché APRÈS l'événement de soumission.

11voto

Dave Anderson Points 5159

J'ai créé un formulaire de test et, en utilisant Firebug, j'ai trouvé cette façon d'obtenir la valeur ;

$('form').submit(function(event){
  alert(event.originalEvent.explicitOriginalTarget.value);
}); 

Malheureusement, seul Firefox prend en charge cet événement.

5 votes

IE ne possède pas cette propriété (explicitOriginalTarget)

1 votes

Le bon vieux IE a tout gâché, j'ai utilisé Firebug et je n'ai pas vu d'autres valeurs d'objet à utiliser, mais j'ai tout simplement oublié les autres navigateurs. Je ne suis pas surpris d'apprendre que ce n'est pas le cas, je vais devoir vérifier Chrome.

12 votes

Seulement Firefox soutient cet événement.

6voto

Voici une approche qui semble plus propre pour mes besoins.

D'abord, pour tous les formulaires :

$('form').click(function(event) {
  $(this).data('clicked',$(event.target))
});

Lorsque cet événement de clic est déclenché pour un formulaire, il enregistre simplement la cible d'origine (disponible dans l'objet événement) pour y accéder ultérieurement. Il s'agit d'une approche assez large, puisqu'elle se déclenchera pour n'importe quel clic n'importe où sur le formulaire. Les commentaires d'optimisation sont les bienvenus, mais je pense que cela ne posera jamais de problèmes notables.

Ensuite, dans $('form').submit(), vous pouvez demander ce qui a été cliqué en dernier, avec quelque chose comme

if ($(this).data('clicked').is('[name=no_ajax]')) xhr.abort();

4voto

cmptrgeekken Points 3863

Según ce lien l'objet Event contient un champ Event.target qui :

Renvoie une chaîne représentant l'objet qui a initié l'événement.

Je viens de créer une page pour tester cette valeur, et il semble que cette représentation concerne le formulaire lui-même, et non le bouton cliqué. En d'autres termes, Javascript ne fournit pas la possibilité de déterminer le bouton cliqué.

Pour ce qui est de Dave Anderson solution il serait bon de le tester dans plusieurs navigateurs avant de l'utiliser. Il est possible que cela fonctionne bien, mais je ne peux pas l'affirmer.

1 votes

El target renvoie l'ensemble du formulaire. Il n'est donc malheureusement pas utile pour détecter le bon bouton d'envoi.

0 votes

C'est ce que je dis dans ma réponse, @Hafenkranich.

0 votes

Event.target n'est pas une chaîne de caractères. C'est un EventTarget qui, dans ce cas, est le formulaire soumis lui-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X