1763 Stimmen

JavaScript Post-Anfrage wie ein Formular abschicken

Ich versuche, einen Browser auf eine andere Seite zu leiten. Wenn ich eine GET-Anfrage wollte, könnte ich sagen

document.location.href = 'http://example.com/q=a';

Aber die Ressource, auf die ich zugreifen möchte, antwortet nicht richtig, es sei denn, ich verwende eine POST-Anforderung. Wenn dies nicht dynamisch generiert würde, könnte ich die HTML

<form action="http://example.com/" method="POST">
  <input type="hidden" name="q" value="a">
</form>

Dann würde ich das Formular einfach aus dem DOM übermitteln.

Aber eigentlich möchte ich JavaScript-Code, der es mir erlaubt, zu sagen

post_to_url('http://example.com/', {'q':'a'});

Was ist die beste browserübergreifende Implementierung?

Modifier

Es tut mir leid, dass ich mich nicht klar ausgedrückt habe. Ich brauche eine Lösung, die den Standort des Browsers ändert, genau wie beim Absenden eines Formulars. Wenn dies möglich ist mit XMLHttpRequest ist es nicht offensichtlich. Und dies sollte nicht asynchron sein, noch XML verwenden, so Ajax ist nicht die Antwort.

2 Stimmen

Wie in einem anderen Thread erwähnt, gibt es ein jquery ".redirect" Plugin, das mit der POST oder GET Methode arbeitet. Es erstellt ein Formular mit versteckten Eingaben und schickt es für Sie ab. Beispiel: $.redirect('demo.php', {'arg1': 'value1', 'arg2': 'value2'}); github.com/mgalante/jquery.redirect/blob/master/

0 Stimmen

Le site document Objekt hat keine location.href Sie benötigen eine zu verwenden window .

2385voto

Rakesh Pai Punkte 25459

Dynamisch erstellen <input> s in ein Formular eintragen und abschicken

/**
 * sends a request to the specified url from a form. this will change the window location.
 * @param {string} path the path to send the post request to
 * @param {object} params the parameters to add to the url
 * @param {string} [method=post] the method to use on the form
 */

function post(path, params, method='post') {

  // The rest of this code assumes you are not using a library.
  // It can be made less verbose if you use one.
  const form = document.createElement('form');
  form.method = method;
  form.action = path;

  for (const key in params) {
    if (params.hasOwnProperty(key)) {
      const hiddenField = document.createElement('input');
      hiddenField.type = 'hidden';
      hiddenField.name = key;
      hiddenField.value = params[key];

      form.appendChild(hiddenField);
    }
  }

  document.body.appendChild(form);
  form.submit();
}

Beispiel:

post('/contact/', {name: 'Johnny Bravo'});

EDIT : Da dies so oft hochgevotet wurde, nehme ich an, dass die Leute dies oft kopieren werden. Also habe ich die hasOwnProperty prüfen, um versehentliche Fehler zu beheben.

14 Stimmen

Was ist mit Arrays in Datenparametern? Jquery post() interpretiert z.B.: "data: {array: [1, 2, 3]}" als ?array=1&array=2&array=3. Dieser Code liefert ein anderes Ergebnis.

29 Stimmen

Warnung: Trotz der vielen positiven Bewertungen ist diese Lösung begrenzt und kann keine Arrays oder verschachtelten Objekte innerhalb eines Formulars verarbeiten. Ansonsten ist es eine großartige Antwort.

1 Stimmen

Ich habe einen Gist mit dem Code erstellt gist.github.com/lingceng/175f493450636e505cc3

155voto

Ryan Delucchi Punkte 7568

Dies wäre eine Version der ausgewählten Antwort mit jQuery .

// Post to the provided URL with the specified parameters.
function post(path, parameters) {
    var form = $('<form></form>');

    form.attr("method", "post");
    form.attr("action", path);

    $.each(parameters, function(key, value) {
        var field = $('<input></input>');

        field.attr("type", "hidden");
        field.attr("name", key);
        field.attr("value", value);

        form.append(field);
    });

    // The form needs to be a part of the document in
    // order for us to be able to submit it.
    $(document.body).append(form);
    form.submit();
}

9 Stimmen

Geringfügig geändert, um Arrays und Objekte zu unterstützen gist.github.com/hom3chuk/692bf12fe7dac2486212

4 Stimmen

Wenn value ein dangeours xml-Zeichen enthält, wird dies in ASP.NET nicht funktionieren encodeUriComponent(value) ist erforderlich. Dann ist UrlDecode auch auf der Server-Seite erforderlich.

1 Stimmen

Wenn Ihre Bedürfnisse einfach sind, ist diese Funktion überflüssig. Dieser Einzeiler ist ausreichend: $("<form method='POST' action='https://example.com'><input type='hidden' name='q' value='a'/></form>").appendTo("body").submit();

87voto

Alexandre Victoor Punkte 2926

Eine einfache Quick-and-Dirty-Implementierung der Antwort von @Aaron:

document.body.innerHTML += '<form id="dynForm" action="http://example.com/" method="post"><input type="hidden" name="q" value="a"></form>';
document.getElementById("dynForm").submit();

Natürlich sollten Sie lieber ein JavaScript-Framework wie Prototyp o jQuery ...

6 Stimmen

Gibt es eine Möglichkeit, dies zu tun, ohne dass eine Webseite im aktuellen Browserfenster/Tab geladen ist?

0 Stimmen

Wie füge ich den csrf hier ein?

0 Stimmen

@Shulz Sie können einen weiteren versteckten Eingang hinzufügen mit [name] auf den Schlüssel gesetzt, und [value] auf den Wert des Tokens gesetzt.

55voto

Jonny Buchanan Punkte 60128

Die Verwendung des createElement Funktion, die in diese Antwort was notwendig ist aufgrund von IE's Unzulänglichkeiten beim Namensattribut bei Elementen, die normalerweise mit document.createElement :

function postToURL(url, values) {
    values = values || {};

    var form = createElement("form", {action: url,
                                      method: "POST",
                                      style: "display: none"});
    for (var property in values) {
        if (values.hasOwnProperty(property)) {
            var value = values[property];
            if (value instanceof Array) {
                for (var i = 0, l = value.length; i < l; i++) {
                    form.appendChild(createElement("input", {type: "hidden",
                                                             name: property,
                                                             value: value[i]}));
                }
            }
            else {
                form.appendChild(createElement("input", {type: "hidden",
                                                         name: property,
                                                         value: value}));
            }
        }
    }
    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form);
}

7 Stimmen

Müssen Sie das Kind nach der Anmeldung entfernen? Wird die Seite nicht sowieso gelöscht?

2 Stimmen

Es gibt keinen Grund, das Kind nach der Übermittlung zu entfernen, es sei denn, es wird eine Sitzung verwendet und diese Daten werden gespeichert.

6 Stimmen

@CantucciHQ Die Seite kann genauso gut unverändert bleiben, auch wenn kein Formularziel gesetzt ist. Es gibt 204 Ohne Inhalt zum Beispiel.

40voto

Kendall Hopkins Punkte 41041

Rakesh Pai's Antwort ist erstaunlich, aber es gibt ein Problem, das bei mir auftritt (in Safari ), wenn ich versuche, ein Formular mit einem Feld namens submit . Zum Beispiel, post_to_url("http://google.com/",{ submit: "submit" } ); . Ich habe die Funktion leicht geändert, um diese variable Raumkollision zu umgehen.

    function post_to_url(path, params, method) {
        method = method || "post";

        var form = document.createElement("form");

        //Move the submit function to another variable
        //so that it doesn't get overwritten.
        form._submit_function_ = form.submit;

        form.setAttribute("method", method);
        form.setAttribute("action", path);

        for(var key in params) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
        }

        document.body.appendChild(form);
        form._submit_function_(); //Call the renamed function.
    }
    post_to_url("http://google.com/", { submit: "submit" } ); //Works!

10 Stimmen

2018 und immer noch keine bessere Antwort?

0 Stimmen

Hat Safari immer noch dieses Problem, das diese Abhilfe erfordert?

0 Stimmen

Die Lösung funktioniert nicht in Safari-Browser und iphone 11 Chrome-Browser / Safari-Browser. während der Navigation erhalten wir "Netzwerk-Verbindung verloren". könnte jemand auf diese bitte beraten. @Flimm ,

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X