jQuery désactiver le bouton Soumettre sur la soumission du formulaire

pour quelque raison que ce soit, bien que ce code rafraîchisse la page, Aucun champ n'est affiché...

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

Est-il une meilleure façon de coder cela?

22
demandé sur Dave Jarvis 2011-03-27 00:26:47

8 réponses

votre code modifie l'action soumettre du formulaire. Au lieu de soumettre, il modifie l'attribut bouton.

essaye ceci:

$('input[type=submit]').click(function() {
    $(this).attr('disabled', 'disabled');
    $(this).parents('form').submit()
})
36
répondu Diodeus - James MacFarlane 2013-06-02 04:44:41

j'ai vu quelques façons de le faire:

  • désactiver les boutons en cliquant sur
  • désactiver les boutons sur soumettre
  • Désactiver le formulaire sur submit

mais aucun ne semble fonctionner comme prévu, donc j'ai fait ma propre méthode.

Ajouter une classe à votre formulaire appelé submit-once et utiliser les jQuery:

$('form.submit-once').submit(function(e){
  if( $(this).hasClass('form-submitted') ){
    e.preventDefault();
    return;
  }
  $(this).addClass('form-submitted');
});

Cela ajoute une autre classe à votre formulaire: form-submitted. Ensuite, si vous essayez de soumettre le formulaire à nouveau et il a cette classe, jQuery empêchera le formulaire de soumettre et de quitter la fonction à return; et donc, rien n'est soumis de nouveau.

j'ai choisi d'utiliser $('form.submit-once') au lieu de $('form') parce que certains de mes formulaires utilisent Ajax qui devrait être en mesure de soumettre plusieurs fois.

Vous pouvez le tester sur ce jsFiddle. J'ai ajouté target="_blank" au formulaire pour que vous puissiez tester la soumission du formulaire plusieurs fois.

Side note: vous pouvez envisager des utilisateurs non-JS en prévenant également double présentations côté serveur. Par exemple, avoir une variable session qui stocke la date/heure de la dernière soumission, et ignorer toute autre soumission dans les 3 secondes.

28
répondu rybo111 2016-05-18 07:41:21

Il n'y a pas de raison que votre code ne devrait pas fonctionner. Lors de la soumission du formulaire, le bouton "soumettre" est désactivé. J'ai vérifié les en-têtes transmis à JSFiddle dans la démo, et le champ de formulaire est effectivement envoyé (testé dans IE et Chrome):

POST http://fiddle.jshell.net/josh3736/YnnGj/show/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://fiddle.jshell.net/josh3736/YnnGj/show/
Accept-Language: en-US,en;q=0.7,es;q=0.3
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: fiddle.jshell.net
Content-Length: 9
Connection: Keep-Alive
Pragma: no-cache

test=It+works

Vos prochaines étapes devraient être:

  • utilisez quelque chose qui vous permet d'inspecter le trafic HTTP (mon préféré est Fiddler) pour voir si vos champs de formulaire sont envoyées à l' serveur. Si elles le sont, c'est évidemment un problème sur votre serveur.
  • si les champs du formulaire ne sont pas envoyés, il se passe autre chose dans votre page. Publier plus de votre code afin que nous puissions voir exactement ce qui se passe.
2
répondu josh3736 2011-03-26 22:51:55

Ce que j'ai fini par utiliser, qui fonctionne dans Chrome 53:

$('input[type=submit]').addClass('submit-once').click(function(e){
    if($(this).hasClass('form-submitted') ){
        e.preventDefault();
        return;
    }
    $(this).addClass('form-submitted');
});
2
répondu SaeX 2016-09-20 19:03:10

Ce qui a fonctionné pour moi....

$('body').bind('pagecreate', function() {
    $("#signin-btn").bind('click', function() {
        $(this).button('disable');
        showProgress(); // The jquery spinny graphic
        $('form').submit();
    });
});
1
répondu user2288459 2013-04-16 22:35:37

si vous avez besoin d'ajouter un bouton, il y a toujours l'étiquette qui peut aider. Si vous ne voulez pas que le bouton Soumettre à soumettre, la meilleure façon est de ne pas ajouter un bouton Soumettre.

0
répondu Bene 2011-03-27 04:32:39

une solution générique, pour toutes les entrées, boutons et liens, en utilisant une icône de chargement d'image, est:

$(function(){
    $(document).on('click', 'input[type=submit], button[type=submit], a.submit, button.submit', function() {

        // Preserves element width
        var w = $(this).outerWidth();
        $(this).css('width', w+'px');

        // Replaces "input" text with "Wait..."
        if ($(this).is('input'))
            $(this).val('Wait...');

        // Replaces "button" and "a" html with a
        // loading image.
        else if ($(this).is('button') || $(this).is('a'))
            $(this).html('<img style="width: 16px; height: 16px;" src="path/to/loading/image.gif"></img>');            

        // Disables the element.
        $(this).attr('disabled', 'disabled');    

        // If the element IS NOT a link, submits the
        // enclosing form.
        if (!$(this).is('a'))    
            if ($(this).parents('form').length)
                $(this).parents('form')[0].submit();

        return true;
    })

});

pour les liens, vous devez ajouter la classe "submit".

0
répondu Arivan Bastos 2015-09-11 17:42:30

votre code est correct. J'ai rencontré ce même problème mais pour moi le problème était dans le php, pas javascript. Lorsque vous désactivez le bouton, il n'est plus envoyé avec le formulaire et mon php comptait sur le bouton Soumettre

if(isset($_POST['submit'])){
   ...
}

donc la page se rafraîchit mais php ne s'exécute pas. J'utilise maintenant un champ différent qui a required l'attribut.

0
répondu VeeK 2017-11-16 11:10:28