Simulieren Sie das Senden eines Post-Formulars mit einem Funktionsaufruf mit Javascript

Lesezeit: 4 Minuten

Benutzer-Avatar von Alfred Huang
Alfred Huang

Mit jQuery können wir das Absenden eines Formulars simulieren:

<form id="form1" method="post">
    <input name="key1" value="value1" />
    <input name="key2" value="value2" />
</form>

Mit einem AJAX-Funktionsaufruf:

$.post('', { key1: 'value1', key2: 'value2' }, function() {
   // do call back
});

Wenn wir verwenden jquery.form.js

$('#form1').ajaxSubmit({
    success: function() {
        // do call back
    }
});

Ok, jetzt kommt meine Frage:

Ich habe das Formular nicht im Markup und möchte ein Formular mit dynamischem Inhalt mithilfe der Methode „POST“ senden.

Ich möchte einen Funktionsaufruf durchführen, um die Prozedur zu simulieren, vielleicht so etwas wie:

utils.post('/url', {key1: 'value1', key2: 'value2'});

Nach diesem Aufruf ist der Effekt genau derselbe wie bei dem Formular, das ich oben habe, und ich sende es auf natürliche Weise synchronisiert ab.

Gibt es eine schöne Möglichkeit, dies zu tun?


Wenn das Problem nicht klar ist, kann ich ein hässliches Beispiel machen, um zu erklären, was ich will:

util.post = function(url, fields) {
    var $form = $('<form action="'+url+'" method="post"></form>');
    var key, val;
    for(key in fields) {
        if(fields.hasOwnProperty(key)) {
            val = fields[key];
            $form.append('<input type="hidden" name="'+key+'" value="'+val+'" />');
        }
    }
    $form.submit();
}

Die obige Methode funktioniert, aber ich denke, sie ist nicht gut genug. Wenn die Felder ein Sonderzeichen oder etwas anderes enthalten, kann es zu einem Fehler kommen.

  • Ich verstehe das Problem nicht. Ruf einfach an $.post() mit dieser URL und diesen Daten.

    – Barmar

    24. Mai 2015 um 9:16 Uhr


  • @Barmar Ich möchte das Formular einfach auf natürliche Weise übermitteln, nicht mit xhr.

    – Alfred Huang

    25. Mai 2015 um 1:01

  • Was meinst du mit „auf natürliche Weise“?

    – TylerH

    26. Mai 2015 um 2:18

  • @TylerH Der Effekt ist genau derselbe, als ob ich ein normales Formular abschicken würde, indem ich auf die Schaltfläche „Senden“ klicke.

    – Alfred Huang

    26. Mai 2015 um 3:06

  • Das ist die POST-Methode. XMLHttpRequest ist dasselbe.

    – TylerH

    26. Mai 2015 um 4:34

Barmars Benutzeravatar
Barmar

Sie können jQuery verwenden, um das Formular funktional zu erstellen, anstatt Zeichenfolgen zu verketten, sodass Sonderzeichen kein Problem darstellen.

Sie müssen dieses Formular an den HTML-Code anhängen body bevor Sie es einreichen; aktuelle Versionen von Chrome Jetzt brauche ich das.

var util = {};
util.post = function(url, fields) {
    var $form = $('<form>', {
        action: url,
        method: 'post'
    });
    $.each(fields, function(key, val) {
         $('<input>').attr({
             type: "hidden",
             name: key,
             value: val
         }).appendTo($form);
    });
    $form.appendTo('body').submit();
}

  • Danke Meister. Halten Sie es übrigens für eine gute Praxis, dies zu tun? Ich möchte diese Funktion zu meinen Toolkit-Funktionen hinzufügen und sie umfassend nutzen.

    – Alfred Huang

    25. Mai 2015 um 2:05

  • Ich sehe keinen Grund, so etwas nicht zu verwenden. Ich empfehle dringend diese Methode zum Erstellen von DOM-Elementen anstelle des Erstellens von HTML-Strings.

    – Barmar

    25. Mai 2015 um 2:09

  • Es liegt ein Problem mit dem Code vor. In append Funktion sollte es geben $('<input>', {...})

    – Gary

    17. November 2015 um 9:20 Uhr


  • Dies schlägt nun in Google Chrome mit einem fehl Form submission canceled because the form is not connected

    – Brian M. Hunt

    22. Dezember 2016 um 1:52

  • Hängen Sie das Formular an den Textkörper an. $form.appendTo('body').submit()

    – Barmar

    22. Dezember 2016 um 14:00 Uhr

Da die akzeptierte Antwort möglicherweise nicht mehr funktioniert, z Chromium-basierte Browser Unter bestimmten Umständen gibt es hier eine Problemumgehung:

util.post = function(url, fields) {
  var $form = $('<form>', {
    action: url,
    method: 'post'
  }).append(
    $.map(fields, function(key, val) {
      return $('<input>').attr({
         type: "hidden",
         name: key,
         value: val
      }).appendTo($form);
    })
  )
  var w = window.open("about:blank")
  w.document.write($form[0].outerHTML)
  w.document.forms[0].submit()
}

Ihr einziges Problem besteht darin, dass Sie .serialize nicht zum Erstellen des Arrays verwenden können, da Sie keine Formularfelder zum Abrufen von Daten haben. Sie müssen das Array nur manuell erstellen.

Key1…Keyn können Namen sein, die Sie anstelle von Namensattributen von Formularfeldern zuweisen (das ist es, was die Serialisierung tatsächlich bewirkt), und Werte können beliebig sein:

  • HTML aus einem Div;
  • von Ihnen berechnete Werte;
  • Javascript-Variablen;
  • Werte kommen von db;

Der Punkt ist, dass Sie auf keinen Fall das Posten eines Formulars simulieren. Mit Ajax bist du gerecht es asynchron machen Und das hilft Ihnen, weil Sie die Seite nicht ändern/neu laden müssen, um die Formularergebnisse auszuarbeiten.

1451890cookie-checkSimulieren Sie das Senden eines Post-Formulars mit einem Funktionsaufruf mit Javascript

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy