2011-04-16 8 views
42

Tengo una función javascript que usa window.open para llamar a otra página y devolver el resultado.Javascript window.open pass values ​​using POST

Aquí está la sección de mi código:

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

Mi problema ahora es que estoy pasando a la cantidad de datos para el GET para manejar y tengo que pasarlo utilizando el método POST.

¿Cómo puedo convertir el código anterior para abrir la página utilizando el método POST, sin poner en práctica formas por toda la página (la página enumera 100 de los pedidos con una lista de proveedores - estoy tratando de mapear los proveedores)

+0

posible duplicado de [Take Código postal de nuevo campo en una ventana nueva] (http://stackoverflow.com/questions/4556242/take-postcode-to-new- campo-en-nueva-ventana) – PleaseStand

Respuesta

50

que utiliza una variación de la anterior, pero en lugar de hTML impresión I construyó un formulario y lo presentó a la tercera parte url:

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

Creo que 'document.body.appendChild (mapForm);' es redundante aquí y se puede omitir con seguridad para no saturar el DOM. – Fedor

+2

@Fedor eliminar esa línea dará como resultado una ventana emergente en blanco en firefox – Mancy

+0

@Mancy gracias por la observación, no había pensado en Firefox – Fedor

27

Gracias php-b-grado. Mejoré el código, no es necesario usar window.open(), el objetivo ya está especificado en el formulario .

// 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(); 

para las opciones de destino ->w3schools - Target

4

gracias php-b-grado!

por debajo de la función genérica para los valores de paso window.open utilizando 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.'); 
}} 
+0

¡Esto es absolutamente correcto! Perfecto para lo que necesitaba. Gracias. – Brandon

+0

d'ont trabajo en firefox – anasmorahhib

1

El código me ayudó a cumplir con mi obligación.

He realizado algunas modificaciones y con un formulario he completado esto. Aquí está mi código-

¿Necesita un atributo 'objetivo' para 'forma' - eso es todo!

Formulario

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

código completo se explica mostrando los elementos del formulario y en forma normal.

2

Aunque esta pregunta fue hace mucho tiempo, gracias a todos por las entradas que me ayudaron con un problema similar. También hice una pequeña modificación basada en las respuestas de los otros aquí y haciendo múltiples entradas/objetos de valor en un solo objeto (json); y espero que esto ayude a alguien.

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; 
6

Por lo que vale la pena, aquí está el código proporcionado anteriormente encapsulado dentro de una función.definición

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

Función:

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