Pour une raison quelconque, bien que ce code actualise la page, aucun champ n'est posté ...
$('form').submit(function(){
$('input[type=submit]', this).attr('disabled', 'disabled');
});
Y at-il une meilleure façon de coder cela?
Votre code modifie l'action d'envoi du formulaire. Au lieu de soumettre, cela change l'attribut du bouton.
Essaye ça:
$('input[type=submit]').click(function() {
$(this).attr('disabled', 'disabled');
$(this).parents('form').submit();
});
J'ai vu plusieurs façons de faire ceci:
Mais aucun ne semble fonctionner comme prévu, alors j'ai créé ma propre méthode.
Ajoutez une classe à votre formulaire appelée submit-once
et utilisez le jQuery suivant:
$('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 à nouveau le formulaire et que cette classe a cette classe, jQuery empêchera le formulaire de se soumettre et quittera la fonction à return;
. Ainsi, rien ne sera soumis à nouveau.
J'ai choisi d'utiliser $('form.submit-once')
au lieu de $('form')
car certains de mes formulaires utilisent Ajax, qui devrait pouvoir être soumis plusieurs fois.
Vous pouvez le tester sur this jsFiddle . J'ai ajouté target="_blank"
au formulaire afin que vous puissiez tester la soumission du formulaire plusieurs fois.
Remarque secondaire: vous voudrez peut-être prendre en compte les utilisateurs non-JS en empêchant également les doubles soumissions côté serveur. Par exemple, ayez une variable de session qui stocke la dernière date/heure de soumission et ignorez toute nouvelle soumission dans les 3 secondes.
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');
});
Il n'y a aucune raison que votre code ne fonctionne pas . Lors de la soumission du formulaire, le bouton d'envoi est désactivé. J'ai vérifié les en-têtes transmis à JSFiddle dans la démo et le champ de formulaire est bien 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:
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();
});
});
Je ne sais pas pourquoi le code en question ne fonctionne pas. Voici un extrait de code simple et direct et je vous conseille de ne pas trop compliquer les choses.
$("form").submit(function () {
// prevent duplicate form submissions
$(this).find(":submit").attr('disabled', 'disabled');
});
Avantages pour moi:
Si vous devez ajouter un bouton, il y a toujours la balise <input type='button'>
qui pourrait vous aider. Si vous ne voulez pas que le bouton d'envoi soit envoyé, le meilleur moyen est de ne pas en ajouter.
Une solution générique, pour toutes les entrées, boutons et liens, utilisant une icône de chargement d'image, est la suivante:
$(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".
Votre code est bon. 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 s'appuyait sur le bouton d'envoi
if(isset($_POST['submit'])){
...
}
Donc, la page est actualisée mais php ne s'exécute pas. J'utilise maintenant un champ différent qui a l'attribut required
.