96 votes

Désactiver le bouton d'envoi lors de l'envoi du formulaire

J'ai écrit ce code pour désactiver les boutons de soumission sur mon site Web après le clic :

$('input[type=submit]').click(function(){
    $(this).attr('disabled', 'disabled');
});

Malheureusement, il n'envoie pas le formulaire. Comment puis-je résoudre ce problème ?

EDIT J'aimerais lier la soumission, pas le formulaire :)

176voto

Jared Farrish Points 26391

Faites-le. onSubmit() :

$('form#id').submit(function(){
    $(this).find(':input[type=submit]').prop('disabled', true);
});

Ce qui se passe, c'est que vous désactivez complètement le bouton avant qu'il ne déclenche l'événement submit.

Vous devriez probablement aussi penser à nommer vos éléments avec des ID ou des CLASSes, afin de ne pas sélectionner toutes les entrées de type submit sur la page.

Démonstration : http://jsfiddle.net/userdude/2hgnZ/

(Note, j'utilise preventDefault() y return false pour que le formulaire ne soit pas réellement soumis dans l'exemple ; laissez cette option désactivée dans votre utilisation).

0 votes

Oui, en fait je veux vraiment lier TOUTES les soumissions dans la page. Donc je ne me soucie pas de l'ID ou de la CLASS de cette façon :) J'ai essayé avec $('input[type=submit]').submit(function() : le formulaire est envoyé, mais le bouton ne se désactive plus...

5 votes

Vous devez mettre le submit() sur le formulaire, pas sur la saisie. Voir la démo.

0 votes

Oui, ça marche ! Le seul problème est que j'ai une fonction onSubmit sur le formulaire, donc c'est lié par jquery shadow it ! J'ai besoin d'implémenter cela sur ma fonction originale, ou de changer l'appel entier ! Merci

42voto

Baig Points 393

Plus précisément, si quelqu'un est confronté à un problème dans Chrome :

Pour remédier à ce problème, vous devez utiliser la fonction onSubmit dans le <form> pour définir le bouton d'envoi disabled . Cela permettra à Chrome de désactiver le bouton immédiatement après qu'il ait été pressé et la soumission du formulaire se fera quand même...

<form name ="myform" method="POST" action="dosomething.php" onSubmit="document.getElementById('submit').disabled=true;"> 
     <input type="submit" name="submit" value="Submit" id="submit"> 
</form>

1 votes

Ce n'est pas ce que souhaite la majeure partie des développeurs. Des trucs en Javascript ne devrait pas être en ligne dans le code HTML. Il est probable que vous utilisiez .on('submit', function() {..}) (ou .submit(function() {..}) ) serait préférable. Même si dans ce cas vous pourriez avoir des problèmes pour redéclencher .submit() sur le formulaire depuis l'intérieur de la callback, tombant dans une boucle sans fin (du moins sur une version récente d'Opera que j'utilise, qui devrait utiliser le même moteur que Chrome).

14 votes

C'est exactement ce que je recherchais. Une simple application en ligne qui ne nécessite pas de librairies externes et qui n'entre pas en jeu même si JavaScript est désactivé.

1 votes

J'ai testé ceci sur un formulaire avec une validation JQuery qui empêche l'envoi si la validation échoue, et j'ai obtenu que le bouton d'envoi soit toujours désactivé par cette réponse.

16voto

Valamas - AUS Points 8359

Les contrôles désactivés ne soumettent pas leurs valeurs ce qui ne permet pas de savoir si l'utilisateur a cliqué sur enregistrer ou supprimer.

Je stocke donc la valeur du bouton dans un fichier caché qui est soumis. Le nom du caché est le même que celui du bouton. J'appelle tous mes boutons par le nom de button .

Par exemple <button type="submit" name="button" value="save">Save</button>

Sur cette base, j'ai trouvé aquí . Il suffit de stocker le bouton cliqué dans une variable.

$(document).ready(function(){
    var submitButton$;

    $(document).on('click', ":submit", function (e)
    {
        // you may choose to remove disabled from all buttons first here.
        submitButton$ = $(this);
    });

    $(document).on('submit', "form", function(e)
    {
        var form$ = $(this);
        var hiddenButton$ = $('#button', form$);
        if (IsNull(hiddenButton$))
        {
            // add the hidden to the form as needed
            hiddenButton$ = $('<input>')
                .attr({ type: 'hidden', id: 'button', name: 'button' })
                .appendTo(form$);
        }
        hiddenButton$.attr('value', submitButton$.attr('value'));
        submitButton$.attr("disabled", "disabled");
    }
});

Voici mon IsNull fonction. Utilisez ou substituez votre propre version pour IsNull ou undefined etc.

function IsNull(obj)
{
    var is;
    if (obj instanceof jQuery)
        is = obj.length <= 0;
    else
        is = obj === null || typeof obj === 'undefined' || obj == "";

    return is;
}

5voto

Shreekar Patel Points 11

Cela devrait être pris en compte dans votre application.

$(":submit").closest("form").submit(function(){
    $(':submit').attr('disabled', 'disabled');
});

4 votes

Il faut utiliser .prop("disabled", true) à la place.

0voto

Tyagi Points 1965

Comment désactiver le bouton d'envoi

il suffit d'appeler une fonction sur l'événement onclick et... de retourner true pour soumettre et false pour désactiver la soumission. OU appeler une fonction sur window.onload comme :

window.onload = init();

et dans init() faire quelque chose comme ceci :

var theForm = document.getElementById(‘theForm’);
theForm.onsubmit =  // what ever you want to do

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