Window.open และส่งผ่านพารามิเตอร์โดยวิธีการโพสต์


103

ด้วยวิธี window.open ฉันเปิดไซต์ใหม่พร้อมพารามิเตอร์ซึ่งฉันต้องผ่านโดยวิธีการโพสต์ฉันพบวิธีแก้ปัญหา แต่น่าเสียดายที่มันไม่ได้ผล นี่คือรหัสของฉัน:

<script  type="text/javascript">    
function openWindowWithPost(url,name,keys,values)
{
    var newWindow = window.open(url, name);

    if (!newWindow) return false;

    var html = "";
    html += "<html><head></head><body><form id='formid' method='post' action='" + url +"'>";

    if (keys && values && (keys.length == values.length))
        for (var i=0; i < keys.length; i++)
            html += "<input type='hidden' name='" + keys[i] + "' value='" + values[i] + "'/>";

    html += "</form><script type='text/javascript'>document.getElementById(\"formid\").submit()</sc"+"ript></body></html>";

    newWindow.document.write(html);
    return newWindow;
}
</script>  

ต่อไปฉันสร้างอาร์เรย์:

<script type="text/javascript">    
var values= new Array("value1", "value2", "value3") 
var keys= new Array("a","b","c") 
</script>  

และเรียกฟังก์ชันโดย:

<input id="Button1" type="button" value="Pass values" onclick="openWindowWithPost('test.asp','',keys,values)" />   

แต่เมื่อฉันคลิกที่ปุ่มนี้ไซต์ test.asp ว่างเปล่า (แน่นอนฉันลองรับค่าผ่าน - Request.Form("b"))

ฉันจะแก้ปัญหานี้ได้อย่างไรทำไมฉันไม่สามารถรับค่าผ่านได้


2
อะไรไม่ทำงาน ฉันบันทึกสำเนาไว้ที่jsfiddle.net/TZMMFและทำงานได้ตามที่คาดไว้
PleaseStand

ขอบคุณสำหรับการตอบ. ใช่ขออภัย - โค้ดด้านบนใช้งานได้ แต่ฉันทดสอบฟังก์ชันนี้ด้วยอาร์เรย์ของคีย์: <script type = "text / javascript"> var values ​​= new Array ("value1", "value2", "value3") var keys = new Array ("1", "2 "," 3 ") // แทนที่ a, b, c </script> ฉันได้รับค่าจาก Request.Form (" 2 ") ใน IE และ Firefox ฉันได้รับหน้าว่างเปล่า
luk4443

คำตอบ:


123

แทนที่จะเขียนแบบฟอร์มลงในหน้าต่างใหม่ (ซึ่งเป็นการยากที่จะทำให้ถูกต้องด้วยการเข้ารหัสค่าในโค้ด HTML) เพียงแค่เปิดหน้าต่างว่างและโพสต์แบบฟอร์มลงไป

ตัวอย่าง:

<form id="TheForm" method="post" action="test.asp" target="TheWindow">
<input type="hidden" name="something" value="something" />
<input type="hidden" name="more" value="something" />
<input type="hidden" name="other" value="something" />
</form>

<script type="text/javascript">
window.open('', 'TheWindow');
document.getElementById('TheForm').submit();
</script>

แก้ไข:

ในการตั้งค่าในรูปแบบไดนามิกคุณสามารถทำได้ดังนี้:

function openWindowWithPost(something, additional, misc) {
  var f = document.getElementById('TheForm');
  f.something.value = something;
  f.more.value = additional;
  f.other.value = misc;
  window.open('', 'TheWindow');
  f.submit();
}

openWindowWithPost('a','b','c');การโพสต์รูปแบบที่คุณเรียกใช้ฟังก์ชันที่มีค่าเช่น

หมายเหตุ: ฉันเปลี่ยนชื่อพารามิเตอร์ให้สัมพันธ์กับชื่อฟอร์มเพื่อแสดงว่าไม่จำเป็นต้องเหมือนกัน โดยปกติคุณจะเก็บไว้ให้ใกล้เคียงกันเพื่อให้ง่ายต่อการติดตามค่า


นั่นคือสิ่งที่ฉันคิด รหัสเดิมที่โพสต์ดูเหมือนจะใช้งานได้ ... ยกเว้นใน IE
PleaseStand

ขอบคุณสำหรับการตอบ. แต่ฉันมีตารางซึ่งในคอลัมน์คือปุ่ม เมื่อฉันคลิกปุ่มนี้ฉันจะเปิดหน้าใหม่และส่งผ่านพารามิเตอร์บางอย่าง ดังนั้นฉันต้องเขียนฟังก์ชันและสำหรับแต่ละปุ่มเรียกมันและส่งผ่านอาร์กิวเมนต์คงที่ คำถามของฉันฉันจะเขียนโค้ดด้านบนของคุณใหม่ให้ทำงานได้อย่างไร
luk4443

1
@ luk4443: หากคุณใช้ URL เมื่อคุณเปิดหน้าต่างเพจจะถูกแทนที่เมื่อคุณโพสต์แบบฟอร์ม ใส่ URL ในactionคุณสมบัติของแบบฟอร์ม
Guffa

1
@ Guffa วิธีใดในการจำลองพฤติกรรมของtarget="_blank"?
Everton

2
@EvertonAgner: ใช้ชื่อเฉพาะสำหรับหน้าต่างและจะทำงานเป็น_blankไฟล์.
Guffa

63

เนื่องจากคุณต้องการแบบฟอร์มทั้งหมดภายในจาวาสคริปต์แทนที่จะเขียนเป็นแท็กคุณสามารถทำได้:

var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "openData.do");

form.setAttribute("target", "view");

var hiddenField = document.createElement("input"); 
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", "message");
hiddenField.setAttribute("value", "val");
form.appendChild(hiddenField);
document.body.appendChild(form);

window.open('', 'view');

form.submit();

5
ไม่มีการใช้ jQuery และ Pure JavaScript ขอบคุณ.
Pawan Pillai

2
หน้า @Mercenary เปิดอยู่ในแท็บใหม่ที่นี่ฉันสามารถเปิดเพจในหน้าต่างป๊อปอัปใหม่ได้หรือไม่
Yaje

30

แม้ว่าฉันจะมาช้าไป 3 ปี แต่เพื่อให้ตัวอย่างของ Guffa ง่ายขึ้นคุณไม่จำเป็นต้องมีแบบฟอร์มบนหน้านี้เลย:

$('<form method="post" action="test.asp" target="TheWindow">
       <input type="hidden" name="something" value="something">
       ...
   </form>').submit();

แก้ไข:

$('<form method="post" action="test.asp" target="TheWindow">
       <input type="hidden" name="something" value="something">
       ...
   </form>').appendTo('body').submit().remove();

อาจเป็นเคล็ดลับที่เป็นประโยชน์สำหรับใครบางคน :)


7
โซลูชันนี้ไม่สมบูรณ์ ขั้นแรกควรเพิ่มแบบฟอร์มนี้ในเนื้อหาแล้วจึงส่ง ดังนั้นที่กล่าวว่า .submit (); ควรพูดว่า. appendTo ('body'). submit ();
Jonathan van de Veen

2
หากไม่มีส่วนนี้$("body").append(form);จะใช้ไม่ได้
Axel

5
หากคุณเพิ่ม.remove()หลังจากที่โจนาธานแนะนำ.appendTo('body').submit()คุณจะทำความสะอาดด้วยตัวคุณเองและไม่เกะกะหน้าปัจจุบันด้วยวัตถุแบบฟอร์ม
Simon

27

ฉันเห็นด้วยอย่างยิ่งกับคำตอบของทหารรับจ้างที่โพสต์ไว้ด้านบนและสร้างฟังก์ชันนี้ให้ฉันซึ่งเหมาะกับฉัน ไม่ใช่คำตอบ แต่เป็นความคิดเห็นในโพสต์ข้างบนโดยMercenary

function openWindowWithPostRequest() {
  var winName='MyWindow';
  var winURL='search.action';
  var windowoption='resizable=yes,height=600,width=800,location=0,menubar=0,scrollbars=1';
  var params = { 'param1' : '1','param2' :'2'};         
  var form = document.createElement("form");
  form.setAttribute("method", "post");
  form.setAttribute("action", winURL);
  form.setAttribute("target",winName);  
  for (var i in params) {
    if (params.hasOwnProperty(i)) {
      var input = document.createElement('input');
      input.type = 'hidden';
      input.name = i;
      input.value = params[i];
      form.appendChild(input);
    }
  }              
  document.body.appendChild(form);                       
  window.open('', winName,windowoption);
  form.target = winName;
  form.submit();                 
  document.body.removeChild(form);           
}

12

คุณสามารถใช้target="_blank"ในแบบฟอร์ม

<form action="action.php" method="post" target="_blank">
    <input type="hidden" name="something" value="some value">
</form>

เพิ่มอินพุตที่ซ่อนอยู่ในแบบที่คุณต้องการจากนั้นส่งแบบฟอร์มด้วย JS


นอกจากนี้window.openจะถูกบล็อกเป็นป๊อปอัปเมื่อไม่มีการเรียกใช้ภายในclickตัวจัดการ (หรือเหตุการณ์ที่ผู้ใช้ยิงเช่นนั้น)
Xenos

4

ฉันสร้างฟังก์ชันเพื่อสร้างฟอร์มโดยยึดตาม url เป้าหมายและอ็อบเจกต์เป็นวิธีPOST/ GETdata และ submit สนับสนุนประเภทที่ซ้อนกันและแบบผสมภายในออบเจ็กต์นั้นดังนั้นจึงสามารถจำลองโครงสร้างใด ๆ ที่คุณป้อนได้ทั้งหมด: PHP จะแยกวิเคราะห์โดยอัตโนมัติและส่งคืนเป็นอาร์เรย์ที่ซ้อนกัน อย่างไรก็ตามมีข้อ จำกัด เพียงข้อเดียวคือวงเล็บ[และ]ต้องไม่เป็นส่วนหนึ่งของคีย์ใด ๆ ในวัตถุ (เช่น{"this [key] is problematic" : "hello world"}) หากมีใครรู้วิธีหลบหนีอย่างถูกต้องโปรดบอก!

โดยไม่ต้องกังวลใจต่อไปนี่คือที่มา:

ตัวอย่างการใช้งาน:

document.body.onclick = function() {
  var obj = {
    "a": [1, 2, [3, 4]],
    "b": "a",
    "c": {
      "x": [1],
      "y": [2, 3],
      "z": [{
        "a": "Hello",
        "b": "World"
      }, {
        "a": "Hallo",
        "b": "Welt"
      }]
    }
  };

  var form = getForm("http://example.com", "_blank", obj, "post");

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


อ๊ะ URL ในตัวอย่างการใช้งานผิดรูปแบบ หากแก้ไขแล้วจะไม่มีข้อผิดพลาดอีกต่อไป
พิธี

1
ดูเหมือนจะพังฉันได้รับหน้าว่าง
Adam Parkin

2

ฉันพบวิธีที่ดีกว่าในการส่งผ่านพารามิเตอร์ไปยังหน้าต่างป๊อปอัปและแม้กระทั่งการดึงพารามิเตอร์จากมัน:

ในหน้าหลัก:

var popupwindow;
var sharedObject = {};

function openPopupWindow()
{
   // Define the datas you want to pass
   sharedObject.var1 = 
   sharedObject.var2 = 
   ...

   // Open the popup window
   window.open(URL_OF_POPUP_WINDOW, NAME_OF_POPUP_WINDOW, POPUP_WINDOW_STYLE_PROPERTIES);
   if (window.focus) { popupwindow.focus(); }
}

function closePopupWindow()
{
    popupwindow.close();

    // Retrieve the datas from the popup window
    = sharedObject.var1;
    = sharedObject.var2;
    ...
}

ในหน้าต่างป๊อปอัป:

var sharedObject = window.opener.sharedObject;

// function you have to to call to close the popup window
function myclose()
{
    //Define the parameters you want to pass to the main calling window
    sharedObject.var1 = 
    sharedObject.var2 = 
    ...
    window.opener.closePopupWindow();
}

แค่นั้นแหละ !

และสะดวกมากเพราะ:

  • คุณยังไม่ได้ตั้งค่าพารามิเตอร์ใน URL ของหน้าต่างป๊อปอัป
  • ไม่มีรูปแบบที่จะกำหนด
  • คุณสามารถใช้พารามิเตอร์ที่ไม่ จำกัด ได้แม้กระทั่งวัตถุ
  • Bi-directionnal: คุณสามารถส่งผ่านพารามิเตอร์และหากคุณต้องการคุณสามารถเรียกคืนพารามิเตอร์ใหม่ได้
  • ใช้งานง่ายมาก

มีความสุข!


หมายเหตุ: window.openerไม่รองรับเบราว์เซอร์ทั้งหมด
Raptor

1

ฉันอยากจะทำในเรื่องนี้ตอบสนองการใช้ธรรมดา Js และดึงข้อมูลpolyfill OP ไม่ได้บอกว่าเขาต้องการสร้างฟอร์มโดยเฉพาะและเรียกใช้เมธอด submit ในนั้นดังนั้นฉันจึงทำโดยโพสต์ค่าฟอร์มเป็น json:

examplePostData = {
    method: 'POST',
    headers: {
       'Content-type' : 'application/json',
       'Accept' : 'text/html'
    },
    body: JSON.stringify({
        someList: [1,2,3,4],
        someProperty: 'something',
        someObject: {some: 'object'}
    })
}

asyncPostPopup = () => {

    //open a new window and set some text until the fetch completes
    let win=window.open('about:blank')
    writeToWindow(win,'Loading...')

    //async load the data into the window
    fetch('../postUrl', this.examplePostData)
    .then((response) => response.text())
    .then((text) => writeToWindow(win,text))
    .catch((error) => console.log(error))
}

writeToWindow = (win,text) => {
    win.document.open()
    win.document.write(text)
    win.document.close()
}

0

การดำเนินการส่งเริ่มต้นคือ Ext.form.action.Submit ซึ่งใช้คำขอ Ajax เพื่อส่งค่าของแบบฟอร์มไปยัง URL ที่กำหนดค่าไว้ ในการเปิดใช้งานการส่งฟอร์ม Ext จากเบราว์เซอร์ตามปกติให้ใช้ตัวเลือก standardSubmit config

ลิงค์: http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.form.Basic-cfg-standardSubmit

วิธีแก้ปัญหา: ใส่ standardSubmit: true ใน config ของคุณ หวังว่าสิ่งนี้จะช่วยคุณได้ :)


0

ฉันเคยใช้สิ่งนี้มาแล้วเนื่องจากโดยปกติแล้วเราจะใช้ไวยากรณ์ของมีดโกนในการเขียนโค้ด

@using (Html.BeginForm("actionName", "controllerName", FormMethod.Post, new { target = "_blank" }))

{

// เพิ่มซ่อนและยื่นแบบฟอร์มที่นี่

}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.