1076 votes

Formulaire de soumission AJAX jQuery

J'ai un formulaire dont le nom est orderproductForm et un nombre indéfini d'entrées.

Je veux faire une sorte de jQuery.get ou ajax ou quelque chose comme ça qui appellerait une page par Ajax, et enverrait toutes les entrées du formulaire. orderproductForm .

Je suppose qu'un moyen serait de faire quelque chose comme

jQuery.get("myurl",
          {action : document.orderproductForm.action.value,
           cartproductid : document.orderproductForm.cartproductid.value,
           productid : document.orderproductForm.productid.value,
           ...

Cependant, je ne connais pas exactement toutes les entrées du formulaire. Existe-t-il une fonctionnalité, une fonction ou quelque chose qui permettrait d'envoyer TOUTES les entrées du formulaire ?

1651voto

Alfrekjv Points 3984

Il s'agit d'une référence simple :

// this is the id of the form
$("#idForm").submit(function(e) {

    e.preventDefault(); // avoid to execute the actual submit of the form.

    var form = $(this);
    var url = form.attr('action');

    $.ajax({
           type: "POST",
           url: url,
           data: form.serialize(), // serializes the form's elements.
           success: function(data)
           {
               alert(data); // show response from the php script.
           }
         });

});

68 votes

Mais form.serialize() ne peut pas afficher <input type="file"> dans IE

4 votes

Excellente réponse pour la soumission d'un formulaire normal !

0 votes

@alex Oui. Il ne devrait pas y avoir de problème (Peut-être quelques différences si vous utilisez this )

863voto

jspcal Points 20715

Vous pouvez utiliser les fonctions ajaxForm/ajaxSubmit à partir de Plugin pour formulaire Ajax ou la fonction jQuery serialize.

AjaxForm :

$("#theForm").ajaxForm({url: 'server.php', type: 'post'})

ou

$("#theForm").ajaxSubmit({url: 'server.php', type: 'post'})

ajaxForm envoie lorsque le bouton submit est pressé. ajaxSubmit envoie immédiatement.

Sérialiser :

$.get('server.php?' + $('#theForm').serialize())

$.post('server.php', $('#theForm').serialize())

La documentation sur la sérialisation AJAX est ici .

2 votes

Idée intéressante, mais je ne contrôle pas le côté serveur que j'appelle, et je ne peux donc pas lui envoyer de données sérialisées.

26 votes

Oui, vous pouvez, le nom n'est pas important ce qu'il fera est d'envoyer des paires de chaque clé de formulaire et chaque variable de formulaire.

7 votes

Il est sérialisé dans une chaîne de requête, tout comme les données que vous mettez dans le tableau manuellement dans l'appel GET. C'est ce que vous voulez, je suis presque sûr.

489voto

Davide Icardi Points 2215

Une autre solution similaire utilise les attributs définis sur l'élément de formulaire :

<form id="contactForm1" action="/your_url" method="post">
    <!-- Form input fields here (do not forget your name attributes). -->
</form>

<script type="text/javascript">
    var frm = $('#contactForm1');

    frm.submit(function (e) {

        e.preventDefault();

        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) {
                console.log('Submission was successful.');
                console.log(data);
            },
            error: function (data) {
                console.log('An error occurred.');
                console.log(data);
            },
        });
    });
</script>

0 votes

Avez-vous des suggestions sur la façon de procéder si l'attribut de nom comprend un "." ? (Exigence côté serveur, pas mon idée).

0 votes

Incluez un rappel d'erreur à cette opération pour la rendre complète. On ne sait jamais quand on aura une erreur, il faut toujours en tenir compte.

1 votes

Si vous ne définissez pas de méthode ou d'action, elles prennent par défaut la forme suivante get et l'URL actuelle respectivement. Il faudrait ajouter cette hypothèse au code.

187voto

superluminary Points 5496

Il y a quelques éléments à prendre en compte.

1. Il existe plusieurs façons de soumettre un formulaire

  • en utilisant le bouton d'envoi
  • en appuyant sur la touche Entrée
  • en déclenchant un événement de soumission en JavaScript
  • éventuellement plus en fonction de l'appareil ou du futur appareil.

Nous devons donc nous lier à la événement de soumission du formulaire et non l'événement de clic du bouton. Cela garantira que notre code fonctionne sur tous les appareils et toutes les technologies d'assistance, maintenant et à l'avenir.

2. Hijax

L'utilisateur n'a peut-être pas activé JavaScript. A hijax est un bon modèle ici, où nous prenons doucement le contrôle du formulaire à l'aide de JavaScript, mais le laissons soumis si JavaScript échoue.

Nous devons tirer l'URL et la méthode du formulaire, de sorte que si le HTML change, nous n'avons pas besoin de mettre à jour le JavaScript.

3. JavaScript discret

Utilisation de event.preventDefault() au lieu de retournez à la case départ est une bonne pratique car elle permet à l'événement de se développer. Cela permet à d'autres scripts de se connecter à l'événement, par exemple les scripts d'analyse qui peuvent surveiller les interactions des utilisateurs.

Vitesse

Nous devrions idéalement utiliser un script externe, plutôt que d'insérer notre script en ligne. Nous pouvons créer un lien vers celui-ci dans la section head de la page à l'aide d'une balise script, ou le lier au bas de la page pour plus de rapidité. Le script doit améliorer discrètement l'expérience de l'utilisateur, et non pas le gêner.

Code

En supposant que vous êtes d'accord avec tout ce qui précède, et que vous voulez attraper l'événement submit, et le traiter via AJAX (un modèle hijax), vous pourriez faire quelque chose comme ceci :

$(function() {
  $('form.my_form').submit(function(event) {
    event.preventDefault(); // Prevent the form from submitting via the browser
    var form = $(this);
    $.ajax({
      type: form.attr('method'),
      url: form.attr('action'),
      data: form.serialize()
    }).done(function(data) {
      // Optionally alert the user of success here...
    }).fail(function(data) {
      // Optionally alert the user of an error here...
    });
  });
});

Vous pouvez déclencher manuellement la soumission d'un formulaire quand vous le souhaitez via JavaScript en utilisant quelque chose comme :

$(function() {
  $('form.my_form').trigger('submit');
});

Edit :

J'ai récemment eu à le faire et j'ai fini par écrire un plugin.

(function($) {
  $.fn.autosubmit = function() {
    this.submit(function(event) {
      event.preventDefault();
      var form = $(this);
      $.ajax({
        type: form.attr('method'),
        url: form.attr('action'),
        data: form.serialize()
      }).done(function(data) {
        // Optionally alert the user of success here...
      }).fail(function(data) {
        // Optionally alert the user of an error here...
      });
    });
    return this;
  }
})(jQuery)

Ajoutez un attribut data-autosubmit à votre balise de formulaire et vous pourrez alors faire ceci :

HTML

<form action="/blah" method="post" data-autosubmit>
  <!-- Form goes here -->
</form>

JS

$(function() {
  $('form[data-autosubmit]').autosubmit();
});

2 votes

Comment puis-je ajouter les rappels aux fonctions "done" et "fail" ? Quelque chose comme $('form[data-autosubmit]').autosubmit().done(function({ ... }) ; C'est possible ?

1 votes

Bonjour @Crusader - certainement, au lieu que ce plugin renvoie ceci, vous pourriez lui faire renvoyer l'événement ajax, puis vous pourriez enchaîner directement dessus. Alternativement, vous pourriez faire en sorte que le plugin reçoive un callback de succès.

0 votes

Je ne vois pas comment cette phrase " laisser le message soumis si JavaScript échoue " se produit ici ?

30voto

Timo Huovinen Points 8283

Version simple (n'envoie pas d'images)

<form action="/my/ajax/url" class="my-form">
...
</form>
<script>
    (function($){
        $("body").on("submit", ".my-form", function(e){
            e.preventDefault();
            var form = $(e.target);
            $.post( form.attr("action"), form.serialize(), function(res){
                console.log(res);
            });
        });
    )(jQuery);
</script>

Copier et coller l'ajaxification d'un formulaire ou de tous les formulaires d'une page

Il s'agit d'une version modifiée de Alfrekjv's réponse

  • Il fonctionnera avec jQuery >= 1.3.2
  • Vous pouvez l'exécuter avant que le document ne soit prêt
  • Vous pouvez supprimer et réintroduire le formulaire et il fonctionnera toujours.
  • Il sera posté au même endroit que le formulaire normal, spécifié dans la section l'attribut "action" du formulaire

JavaScript

jQuery(document).submit(function(e){
    var form = jQuery(e.target);
    if(form.is("#form-id")){ // check if this is the form that you want (delete this check to apply this to all forms)
        e.preventDefault();
        jQuery.ajax({
            type: "POST",
            url: form.attr("action"), 
            data: form.serialize(), // serializes the form's elements.
            success: function(data) {
                console.log(data); // show response from the php script. (use the developer toolbar console, firefox firebug or chrome inspector console)
            }
        });
    }
});

Je voulais modifier la réponse d'Alfrekjv mais je m'en suis trop éloigné et j'ai décidé de poster cette réponse séparément.

N'envoie pas de fichiers, ne prend pas en charge les boutons, par exemple, le fait de cliquer sur un bouton (y compris un bouton d'envoi) envoie sa valeur sous forme de données de formulaire, mais comme il s'agit d'une requête ajax, le clic sur le bouton ne sera pas envoyé.

Pour prendre en charge les boutons, vous pouvez capturer le clic réel sur le bouton au lieu de l'envoi.

jQuery(document).click(function(e){
    var self = jQuery(e.target);
    if(self.is("#form-id input[type=submit], #form-id input[type=button], #form-id button")){
        e.preventDefault();
        var form = self.closest('form'), formdata = form.serialize();
        //add the clicked button to the form data
        if(self.attr('name')){
            formdata += (formdata!=='')? '&':'';
            formdata += self.attr('name') + '=' + ((self.is('button'))? self.html(): self.val());
        }
        jQuery.ajax({
            type: "POST",
            url: form.attr("action"), 
            data: formdata, 
            success: function(data) {
                console.log(data);
            }
        });
    }
});

Du côté du serveur, vous pouvez détecter une requête ajax avec cet en-tête que jquery met HTTP_X_REQUESTED_WITH pour php

PHP

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    //is ajax
}

0 votes

Comment cela fonctionnerait-il si vous vouliez effectivement envoyer un fichier avec ce formulaire ?

1 votes

@YamiMedina ce n'est pas une solution simple, vous devez envoyer la requête entière dans un format différent (format multipart) avec les données du fichier.

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