Javascript window.open Passwerte mit POST öffnen

75

Ich habe eine Javascript-Funktion, die window.open verwendet, um eine andere Seite aufzurufen und das Ergebnis zurückzugeben.

Hier ist der Abschnitt meines Codes:

var windowFeatures = "status=0, toolbar=0, location=0, menubar=0, directories=0, resizable=1, scrollbars=1";
window.open ('http://www.domain.com/index.php?p=view.map&coords=' + encodeURIComponent(coords), 'JobWindow', windowFeatures);

Mein Problem ist jetzt, dass ich zu viele Daten übergebe, damit das GET sie verarbeiten kann, und dass ich sie mit der POST-Methode übergeben muss.

Wie kann ich den obigen Code konvertieren, um die Seite mit der POST-Methode zu öffnen, ohne Formulare auf der gesamten Seite zu implementieren (auf der Seite werden Hunderte von Bestellungen mit einer Liste von Lieferanten aufgelistet - ich versuche, die Lieferanten zuzuordnen).

PHP-B-Grader
quelle

Antworten:

70

Ich habe eine Variation der oben genannten verwendet, aber anstatt HTML zu drucken, habe ich ein Formular erstellt und es an die URL eines Drittanbieters gesendet:

    var mapForm = document.createElement("form");
    mapForm.target = "Map";
    mapForm.method = "POST"; // or "post" if appropriate
    mapForm.action = "http://www.url.com/map.php";

    var mapInput = document.createElement("input");
    mapInput.type = "text";
    mapInput.name = "addrs";
    mapInput.value = data;
    mapForm.appendChild(mapInput);

    document.body.appendChild(mapForm);

    map = window.open("", "Map", "status=0,title=0,height=600,width=800,scrollbars=1");

if (map) {
    mapForm.submit();
} else {
    alert('You must allow popups for this map to work.');
}
PHP-B-Grader
quelle
1
Ich denke, document.body.appendChild(mapForm);ist hier überflüssig und kann sicher weggelassen werden, um DOM nicht zu überladen.
Fedor
2
@Fedor das Entfernen dieser Zeile führt zu einem leeren Popup auf Firefox
Mancy
@Mancy danke für die Bemerkung, hatte nicht an Firefox
Fedor
wenn Sie sich keine Sorgen um Ihre Daten machen | window.open ('xxx_url.php? xxx_var =' + xxx_var + '& xxx2_var =' + xxx2_var, '_blank');
Ruthe
1
@rut Es gibt einen Unterschied zwischen dem Senden von Daten als GET- und POST-Befehl. Die Frage betraf das Senden von Daten mit dem POST-Befehl.
StanE
45

Vielen Dank, dass Sie PHP-B-Grader . Ich habe den Code verbessert, es ist nicht notwendig, window.open () zu verwenden , das Ziel ist bereits im Formular angegeben .

// Create a form
var mapForm = document.createElement("form");
mapForm.target = "_blank";    
mapForm.method = "POST";
mapForm.action = "abmCatalogs.ftl";

// Create an input
var mapInput = document.createElement("input");
mapInput.type = "text";
mapInput.name = "variable";
mapInput.value = "lalalalala";

// Add the input to the form
mapForm.appendChild(mapInput);

// Add the form to dom
document.body.appendChild(mapForm);

// Just submit
mapForm.submit();

für Zieloptionen -> w3schools - Ziel

Facundo Victor
quelle
32

Hier ist der zuvor bereitgestellte Code, der in einer Funktion gekapselt ist.

openWindowWithPost("http://www.example.com/index.php", {
    p: "view.map",
    coords: encodeURIComponent(coords)
});

Funktionsdefinition:

function openWindowWithPost(url, data) {
    var form = document.createElement("form");
    form.target = "_blank";
    form.method = "POST";
    form.action = url;
    form.style.display = "none";

    for (var key in data) {
        var input = document.createElement("input");
        input.type = "hidden";
        input.name = key;
        input.value = data[key];
        form.appendChild(input);
    }

    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form);
}
reformiert
quelle
2
IMHO Dies ist die beste Antwort. Beachten Sie, dass das Formular nach dem Senden entfernt und das DOM gereinigt wird. Es ist auch als gebrauchsfertige Funktion geschrieben. Gute Arbeit
Jaume Mussons Abad
document.body.removeChild (Formular); Für mich stellte diese Zeile sicher, dass die Eingabefelder ausgeblendet waren
Shark Lasers
7

danke php-b-grader!

unterhalb der generischen Funktion für window.open-Durchlaufwerte mit POST:

function windowOpenInPost(actionUrl,windowName, windowFeatures, keyParams, valueParams) 
{
    var mapForm = document.createElement("form");
    var milliseconds = new Date().getTime();
    windowName = windowName+milliseconds;
    mapForm.target = windowName;
    mapForm.method = "POST";
    mapForm.action = actionUrl;
    if (keyParams && valueParams && (keyParams.length == valueParams.length)){
        for (var i = 0; i < keyParams.length; i++){
        var mapInput = document.createElement("input");
            mapInput.type = "hidden";
            mapInput.name = keyParams[i];
            mapInput.value = valueParams[i];
            mapForm.appendChild(mapInput);

        }
        document.body.appendChild(mapForm);
    }


    map = window.open('', windowName, windowFeatures);
if (map) {
    mapForm.submit();
} else {
    alert('You must allow popups for this map to work.');
}}
PeterPink
quelle
Das ist absolut richtig! Perfekt für das, was ich brauchte. Vielen Dank.
Brandon
2

Obwohl diese Frage schon lange her ist, danke ich allen für die Beiträge, die mir bei einem ähnlichen Problem geholfen haben. Ich habe auch ein bisschen Änderungen vorgenommen, basierend auf den Antworten der anderen hier und mehrere Eingaben / Wertsachen in ein einzelnes Objekt (json) gemacht. und hoffe das hilft jemandem.

js:

//example: params={id:'123',name:'foo'};

mapInput.name = "data";
mapInput.value = JSON.stringify(params); 

PHP:

$data=json_decode($_POST['data']); 

echo $data->id;
echo $data->name;
früh
quelle
1

Der Code hat mir geholfen, meine Anforderung zu erfüllen.

Ich habe einige Änderungen vorgenommen und mit einem Formular dieses ausgefüllt. Hier ist mein Code-

Benötigen Sie ein 'Ziel'-Attribut für' Formular '- fertig!

Bilden

<form id="view_form" name="view_form" method="post" action="view_report.php"  target="Map" >
  <input type="text" value="<?php echo $sale->myvalue1; ?>" name="my_value1"/>
  <input type="text" value="<?php echo $sale->myvalue2; ?>" name="my_value2"/>
  <input type="button" id="download" name="download" value="View report" onclick="view_my_report();"   /> 
</form>

JavaScript

function view_my_report() {     
   var mapForm = document.getElementById("view_form");
   map=window.open("","Map","status=0,title=0,height=600,width=800,scrollbars=1");

   if (map) {
      mapForm.submit();
   } else {
      alert('You must allow popups for this map to work.');
   }
}

Der vollständige Code wird mit normaler Form und Formularelementen erläutert.

Nikz
quelle