126 votes

Comment faire un Callback Jquery après l'envoi du formulaire ?

J'ai un formulaire simple avec remote=true.

Ce formulaire se trouve en fait dans une boîte de dialogue HTML, qui se ferme dès que l'on clique sur le bouton "Submit".

Maintenant, je dois faire quelques changements sur la page HTML principale après que le formulaire ait été soumis avec succès.

J'ai essayé de le faire en utilisant jQuery. Mais cela ne garantit pas que les tâches soient exécutées après une certaine forme de réponse à la soumission du formulaire.

$("#myform").submit(function(event) {

// do the task here ..

});

Comment attacher un callback, de sorte que mon code ne soit exécuté qu'une fois le formulaire soumis avec succès ? Existe-t-il un moyen d'ajouter un callback .success ou .complete au formulaire ?

0 votes

Pourquoi n'utilisez-vous pas Ajax ? Avec les fonctions Ajax de jQuery, vous pouvez définir de tels callbacks.

12 votes

Davidbuzatto, il y a des cas où vous ne pouvez pas utiliser ajax. Par exemple, lorsque vous voulez télécharger un fichier.

3 votes

@Pere Pas vrai ici dans le futur.

126voto

Jamaica Geek Points 1507

Je viens de faire ça -

 $("#myform").bind('ajax:complete', function() {

         // tasks to do 

   });

Et tout a fonctionné à merveille.

Voir la documentation de cette api pour des détails plus spécifiques.

3 votes

Wow... Je viens d'apprendre quelque chose de nouveau. Oui, à première vue, c'est la solution la plus simple. Peut-être même que c'est la meilleure. Je suis un lecteur assidu de Coding Horror, et dans ce blog, Jeff Attwood insiste sur le fait que nous devrions écrire moins de code, et cette méthode y parvient. Bonne trouvaille :)

0 votes

S'il vous plaît dites-moi comment vous pouvez utiliser ajax:complete lors de la liaison de votre formulaire ? Nous ne pouvons pas trouver une propriété liée à un formulaire comme 'ajax:complete'.

0 votes

Ajax:complete peut être attaché à n'importe quel événement Ajax. Lorsque l'événement se termine, il est déclenché. Dans mon formulaire, j'ai utilisé "remote=true" - ce qui signifie que le formulaire est soumis via Ajax. Vous pouvez donc attacher un ajax:complete à la soumission du formulairehttp://api.jquery.com/ajaxComplete/.

39voto

Bradley Bossard Points 732

Je n'ai pas réussi à faire fonctionner la solution numéro un des votes positifs de manière fiable, mais j'ai découvert que cette solution fonctionne. Je ne sais pas si c'est obligatoire ou non, mais je n'ai pas d'attribut action ou method sur la balise, ce qui garantit que le POST est traité par la fonction $.ajax et vous donne l'option de rappel.

<form id="form">
...
<button type="submit"></button>
</form>

<script>
$(document).ready(function() {
  $("#form_selector").submit(function() {

    $.ajax({
     type: "POST",
      url: "form_handler.php",
      data: $(this).serialize(),
      success: function() {
        // callback code here
       }
    })

  })
})
</script>

1 votes

+1. La clé de cette réponse est le $(this).serialize() ligne. Il vous permet d'utiliser jQuery.ajax() pour soumettre le formulaire existant en arrière-plan, puis récupérer la réponse du serveur et en faire quelque chose.

18 votes

Javascript sans point-virgule... certaines personnes veulent juste regarder le monde brûler. Votre solution fonctionne cependant, alors merci :)

2 votes

Notez que .serialize n'inclut pas les entrées de fichiers dans votre requête POST. Utilisez le HTML5 FormData (voir cette question ) à la place, à moins que vous ne preniez en charge d'anciens navigateurs comme IE < 9

23voto

Salehen Rahman Points 1070

Vous devrez faire les choses manuellement avec un appel AJAX au serveur. Pour ce faire, vous devrez également modifier le formulaire.

Mais ne vous inquiétez pas, c'est un jeu d'enfant. Voici un aperçu de la manière dont vous allez travailler avec votre formulaire :

  • Remplacer l'action d'envoi par défaut (grâce à l'objet d'événement transmis, qui a un objet preventDefault méthode)
  • récupérer toutes les valeurs nécessaires du formulaire
  • lancer une requête HTTP
  • traiter la réponse à la demande

Tout d'abord, vous devrez annuler l'action d'envoi du formulaire comme suit :

$("#myform").submit(function(event) {
    // Cancels the form's submit action.
    event.preventDefault();
});

Et ensuite, saisissez la valeur des données. Supposons que vous ayez une zone de texte.

$("#myform").submit(function(event) {
    event.preventDefault();
    var val = $(this).find('input[type="text"]').val();
});

Et ensuite envoyer une demande. Supposons que c'est une requête POST.

$("#myform").submit(function(event) {
    event.preventDefault();
    var val = $(this).find('input[type="text"]').val();

    // I like to use defers :)
    deferred = $.post("http://somewhere.com", { val: val });

    deferred.success(function () {
        // Do your stuff.
    });

    deferred.error(function () {
        // Handle any errors here.
    });
});

Et ça devrait le faire.

Note 2 : Pour l'analyse syntaxique des données du formulaire, il est préférable d'utiliser un fichier de type plugin . Il vous facilitera la vie et fournira une sémantique agréable qui imite l'action réelle d'envoi d'un formulaire.

Note 2 : Vous n'êtes pas obligé d'utiliser des defers. C'est juste une préférence personnelle. Vous pouvez également faire ce qui suit, et cela devrait fonctionner aussi.

$.post("http://somewhere.com", { val: val }, function () {
    // Start partying here.
}, function () {
    // Handle the bad news here.
});

2 votes

Superbe exemple. Comment faire la même chose avec le téléchargement de fichiers (multi-part/form-data) ?

0 votes

Note 2 : N'utilisez pas de plugin pour gérer les données du formulaire, ou récupérez manuellement chaque valeur du formulaire vous-même. Utilisez l'objet JS FormData pour récupérer l'ensemble des données du formulaire en une seule fois, y compris les données multi-parties/fichiers : var formData = new FormData(this);

10voto

edepperson Points 418

Pour MVC, il existe une approche encore plus simple. Vous devez utiliser le formulaire Ajax et définir les AjaxOptions

@using (Ajax.BeginForm("UploadTrainingMedia", "CreateTest", new AjaxOptions() { HttpMethod = "POST", OnComplete = "displayUploadMediaMsg" }, new { enctype = "multipart/form-data", id = "frmUploadTrainingMedia" }))
{ 
  ... html for form
}

Voici le code de soumission, qui se trouve dans la section du document prêt et qui lie l'événement onclick du bouton à la soumission du formulaire.

$("#btnSubmitFileUpload").click(function(e){
        e.preventDefault();
        $("#frmUploadTrainingMedia").submit();
});

voici le callback référencé dans les AjaxOptions

function displayUploadMediaMsg(d){
    var rslt = $.parseJSON(d.responseText);
    if (rslt.statusCode == 200){
        $().toastmessage("showSuccessToast", rslt.status);
    }
    else{
        $().toastmessage("showErrorToast", rslt.status);
    }
}

dans la méthode du contrôleur pour MVC, cela ressemble à ceci

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult UploadTrainingMedia(IEnumerable<HttpPostedFileBase> files)
{
    if (files != null)
    {
        foreach (var file in files)
        {
            // there is only one file  ... do something with it
        }
        return Json(new
        {
            statusCode = 200,
            status = "File uploaded",
            file = "",
        }, "text/html");
    }
    else
    {
        return Json(new
        {
            statusCode = 400,
            status = "Unable to upload file",
            file = "",
        }, "text/html");
    }
}

2 votes

Ces codes sont des codes .Net, et la question ne le précise pas.

13 votes

Ce n'est vraiment pas une bonne raison pour ne pas voter. La réponse fonctionne et pourrait aider un développeur .NET confronté au même problème.

0 votes

J'aime cette idée, mais pour une raison quelconque, le rappel ne se déclenche pas. La méthode du contrôleur doit-elle renvoyer un JsonResult ? Ma méthode de contrôle renvoie actuellement un ActionResult.

7voto

Sindre Points 1388

Je ne crois pas qu'il existe une fonction de rappel comme celle que vous décrivez.

Ce qui est normal ici, c'est d'effectuer les modifications à l'aide d'un langage côté serveur, comme le PHP.

En PHP, vous pouvez par exemple récupérer un champ caché de votre formulaire et effectuer des modifications s'il est présent.

PHP :

  $someHiddenVar = $_POST["hidden_field"];
    if (!empty($someHiddenVar)) {
        // do something 
    }

Une façon de procéder dans Jquery est d'utiliser Ajax. Vous pourriez écouter submit, renvoyer false pour annuler son comportement par défaut et utiliser jQuery.post() à la place. jQuery.post a un success-callback.

$.post("test.php", $("#testform").serialize(), function(data) {
  $('.result').html(data);
});

http://api.jquery.com/jQuery.post/

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