jQuery AJAX soumettre le formulaire

J'ai un formulaire avec nom orderproductForm et un nombre indéterminé d'intrants.

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

Je suppose qu'une façon 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 de formulaire. Y a-t-il une fonctionnalité, une fonction ou quelque chose qui enverrait simplement toutes les entrées de formulaire?

766
demandé sur abhinav3414 2009-12-25 04:31:48

15 réponses

Vous pouvez utiliser les fonctions ajaxForm/ajaxSubmit de Ajax Form Plugin {[5] } ou la fonction jQuery serialize.

AjaxForm:

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

Ou

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

AjaxForm enverra lorsque le bouton Soumettre est pressé. ajaxSubmit envoie immédiatement.

Sérialiser:

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

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

La documentation de sérialisation AJAX est ici .

708
répondu jspcal 2017-03-18 13:31:28

Ceci est une référence simple:

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


    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.
           }
         });

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

J'espère que ça vous aidera.

1123
répondu Alfrekjv 2018-07-26 12:12:57

Une autre solution similaire utilisant des 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>
424
répondu Davide Icardi 2017-05-20 17:26:57

, Il ya quelques choses que vous devez garder à l'esprit.

1. Il y a plusieurs façons de soumettre un formulaire

  • en utilisant le bouton soumettre
  • en appuyant sur Entrée
  • en déclenchant un événement submit en JavaScript
  • peut-être plus en fonction de l'appareil ou de l'appareil futur.

Nous devrions donc nous lier à l'événement form submit , pas à l'événement button click. Cela garantira que notre code fonctionne sur tous les appareils et technologies d'assistance maintenant et dans l'avenir.

2. Hijax

JavaScript N'est peut-être pas activé pour L'utilisateur. Un modèle hijax est bon ici, où nous prenons doucement le contrôle du formulaire en utilisant JavaScript, mais le laissons submittable si JavaScript échoue.

Nous devrions extraire L'URL et la méthode du formulaire, donc si le HTML change, nous n'avons pas besoin de mettre à jour le JavaScript.

3. JavaScript Discret

En utilisant l'événement .preventDefault () au lieu de retour false est une bonne pratique car elle permet à l'événement de gonfler. Cela permet à d'Autres scripts de se lier à l'événement, par exemple des 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 cela dans la section head de la page en utilisant une balise de script, ou un lien vers elle au bas de la page pour la vitesse. Le script devrait tranquillement améliorer l'expérience utilisateur, pas vous façon.

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 gérer via AJAX (un motif hijax), vous pouvez 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 une soumission de formulaire quand vous le souhaitez via JavaScript en utilisant quelque chose comme:

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

Modifier:

J'ai récemment dû 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 pouvez ensuite, faites ceci:

HTML

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

JS

$(function() {
  $('form[data-autosubmit]').autosubmit();
});
166
répondu superluminary 2015-12-14 11:33:57

Vous pouvez également utiliser FormData (mais non disponible dans IE):

var formData = new FormData(document.getElementsByName('yourForm')[0]);// yourForm: form selector        
$.ajax({
    type: "POST",
    url: "yourURL",// where you wanna post
    data: formData,
    processData: false,
    contentType: false,
    error: function(jqXHR, textStatus, errorMessage) {
        console.log(errorMessage); // Optional
    },
    success: function(data) {console.log(data)} 
});

Voici comment vous utilisez FormData .

28
répondu macio.Jun 2018-03-27 08:06:21

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 sur une page

C'est une version modifiée de réponse

  • cela fonctionnera avec jQuery > = 1.3.2
  • Vous pouvez l'exécuter avant que le document ne soit prêt
  • Vous pouvez supprimer et ajouter à nouveau le formulaire et cela fonctionnera toujours
  • Il affichera au même emplacement que le formulaire normal, spécifié dans le formulaire "action" attribut

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 éditer la réponse D'Alfrekjv mais j'en ai trop dévié, alors j'ai décidé de poster ceci comme une réponse séparée.

N'envoie pas de fichiers, ne prend pas en charge les boutons, par exemple en cliquant sur un bouton (y compris un bouton de soumission) envoie sa valeur en tant que 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 de bouton réel au lieu du soumettre.

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);
            }
        });
    }
});

Côté serveur, vous pouvez détecter une requête ajax avec cet en-tête que jQuery définit HTTP_X_REQUESTED_WITH pour php

PHP

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    //is ajax
}
25
répondu Timo Huovinen 2017-05-23 12:34:51

Ce code fonctionne même avec l'entrée de fichier

$(document).on("submit", "form", function(event)
{
    event.preventDefault();        
    $.ajax({
        url: $(this).attr("action"),
        type: $(this).attr("method"),
        dataType: "JSON",
        data: new FormData(this),
        processData: false,
        contentType: false,
        success: function (data, status)
        {

        },
        error: function (xhr, desc, err)
        {


        }
    });        
});
21
répondu Shaiful Islam 2015-02-07 19:35:55

J'ai vraiment aimé cette réponse par superluminary et surtout la façon dont il est enveloppé solution dans un jQuery plugin. Merci donc à superluminary pour une réponse très utile. Dans mon cas, je voulais un plugin qui me permettrait de définir les succès et erreur gestionnaires d'événements par le biais des options lorsque le plugin est initialisé.

Voici donc ce que je suis venu avec:

;(function(defaults, $, undefined) {
    var getSubmitHandler = function(onsubmit, success, error) {
        return function(event) {
            if (typeof onsubmit === 'function') {
                onsubmit.call(this, event);
            }
            var form = $(this);
            $.ajax({
                type: form.attr('method'),
                url: form.attr('action'),
                data: form.serialize()
            }).done(function() {
                if (typeof success === 'function') {
                    success.apply(this, arguments);
                }
            }).fail(function() {
                if (typeof error === 'function') {
                    error.apply(this, arguments);
                }
            });
            event.preventDefault();
        };
    };
    $.fn.extend({
        // Usage:
        // jQuery(selector).ajaxForm({ 
        //                              onsubmit:function() {},
        //                              success:function() {}, 
        //                              error: function() {} 
        //                           });
        ajaxForm : function(options) {
            options = $.extend({}, defaults, options);
            return $(this).each(function() {
                $(this).submit(getSubmitHandler(options['onsubmit'], options['success'], options['error']));
            });
        }
    });
})({}, jQuery);

Ce plugin me permet de très facilement " ajaxify" les formulaires html sur la page et fournir onsubmit, la réussite et erreur gestionnaires d'événements pour la mise en œuvre de la rétroaction à l'utilisateur de l'état du formulaire de soumission. Cela a permis au plugin d'être utilisé comme suit:

 $('form').ajaxForm({
      onsubmit: function(event) {
          // User submitted the form
      },
      success: function(data, textStatus, jqXHR) {
          // The form was successfully submitted
      },
      error: function(jqXHR, textStatus, errorThrown) {
          // The submit action failed
      }
 });

Remarque que le succès et erreur gestionnaires d'événement reçoivent les mêmes arguments que vous recevrez les événements correspondants de la jQuery ajax méthode.

11
répondu BruceHill 2017-05-23 12:34:51

J'ai eu ce qui suit pour moi:

formSubmit('#login-form', '/api/user/login', '/members/');

function formSubmit(form, url, target) {
    $(form).submit(function(event) {
        $.post(url, $(form).serialize())
            .done(function(res) {
                if (res.success) {
                    window.location = target;
                }
                else {
                    alert(res.error);
                }
            })
            .fail(function(res) {
                alert("Server Error: " + res.status + " " + res.statusText);

            })
        event.preventDefault();
    });
}

Cela suppose que le post to ' url ' renvoie un ajax sous la forme de {success: false, error:'my Error to display'}

Vous pouvez varier cela comme vous le souhaitez. N'hésitez pas à utiliser ce morceau de code.

9
répondu Tarion 2014-01-21 20:47:00

Pensez à utiliser closest

$('table+table form').closest('tr').filter(':not(:last-child)').submit(function (ev, frm) {
        frm = $(ev.target).closest('form');
        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) {
                alert(data);
            }
        })
        ev.preventDefault();
    });
5
répondu test30 2016-10-26 10:49:23

JQuery AJAX submit form , n'est rien d'autre que de soumettre un formulaire en utilisant l'ID de formulaire lorsque vous cliquez sur un bouton

, Veuillez suivre les étapes

Étape 1-La balise de formulaire doit avoir un champ ID

<form method="post" class="form-horizontal" action="test/user/add" id="submitForm">
.....
</form>

Bouton sur lequel vous allez cliquer

<button>Save</button>

Étape 2 - submit l'événement est dans jQuery qui aide à soumettre un formulaire. dans le code ci-dessous, nous préparons la requête JSON de L'élément HTML name.

$("#submitForm").submit(function(e) {
    e.preventDefault();
    var frm = $("#submitForm");
    var data = {};
    $.each(this, function(i, v){
        var input = $(v);
        data[input.attr("name")] = input.val();
        delete data["undefined"];
    });
    $.ajax({
        contentType:"application/json; charset=utf-8",
        type:frm.attr("method"),
        url:frm.attr("action"),
        dataType:'json',
        data:JSON.stringify(data),
        success:function(data) {
            alert(data.message);
        }
    });
});

Pour la démo en direct, cliquez sur le lien ci-dessous

Comment soumettre un formulaire en utilisant jQuery AJAX?

5
répondu jeet singh parmar 2018-01-11 08:05:00

Pour éviter les envois multiples de formdata:

N'oubliez pas de dissocier l'événement submit, avant que le formulaire ne soit soumis à nouveau, L'utilisateur peut appeler la fonction sumbit plus d'une fois, peut-être qu'il a oublié quelque chose, ou était une erreur de validation.

 $("#idForm").unbind().submit( function(e) {
  ....
4
répondu Pavel Zheliba 2014-11-13 18:43:37

Si vous utilisez forme.serialize() - vous devez donner à chaque élément de formulaire un nom comme ceci:

<input id="firstName" name="firstName" ...

Et le formulaire est sérialisé comme ceci:

firstName=Chris&lastName=Halcrow ...
4
répondu Chris Halcrow 2016-04-26 23:48:18

Vous pouvez l'utiliser sur la fonction de soumission comme ci-dessous.

Formulaire HTML

<form class="form" action="" method="post">
    <input type="text" name="name" id="name" >
    <textarea name="text" id="message" placeholder="Write something to us"> </textarea>
    <input type="button" onclick="return formSubmit();" value="Send">
</form>

Fonction JQuery:

<script>
    function formSubmit(){
        var name = document.getElementById("name").value;
        var message = document.getElementById("message").value;
        var dataString = 'name='+ name + '&message=' + message;
        jQuery.ajax({
            url: "submit.php",
            data: dataString,
            type: "POST",
            success: function(data){
                $("#myForm").html(data);
            },
            error: function (){}
        });
    return true;
    }
</script>

Pour plus de détails et visite d'échantillon: http://www.spiderscode.com/simple-ajax-contact-form/

3
répondu suresh raj 2016-12-21 09:22:07

Il y a aussi l'événement submit, qui peut être déclenché comme ceci $("#form_id").soumettre(). Vous utiliseriez cette méthode si le formulaire est déjà bien représenté en HTML. Vous venez de lire dans la page, remplir les entrées de formulaire avec des choses, puis appeler .soumettre(). Il utilisera la méthode et l'action définies dans la déclaration du formulaire, vous n'avez donc pas besoin de le copier dans votre javascript.

Exemples

-20
répondu billw 2013-06-04 17:48:34