Window.open并通过post方法传递参数

随着window.open方法,我打开新的网站的参数,我必须通过post方法。我find了解决scheme,但不幸的是,它不工作。 这是我的代码:

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

接下来,我创build数组:

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

并通过以下呼叫function:

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

但是,当我点击这个button,网站test.asp是空的(当然我尝试获得传递值 – Request.Form("b") )。

我怎么能解决这个问题,为什么我不能获得传球价值?

而不是写一个表单到新的窗口(这是很难得到正确的,在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> 

编辑:

要dynamic地设置表单中的值,可以这样做:

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

注:我改变了与表单名称有关的参数名称,以表明它们不必相同。 通常你会保持它们彼此相似,以便更容易跟踪值。

既然你想要在JavaScript内部的整个表单,而不是写在标签,你可以这样做:

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

尽pipe我迟了3年,但为了简化Guffa的例子,你甚至不需要在页面上有表格:

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

也许一个有用的提示为人:)

我完全同意上面贴出的雇佣兵的答案,并为我创造了这个function。 这不是一个答案,这是雇佣军对上述职位的评论

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

你可以简单地在表单上使用target="_blank"

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

以你喜欢的方式添加隐藏的input,然后简单地用JS提交表单。

我创build了一个函数来生成一个表单,基于url,target和一个对象作为POST / GET数据和提交方法。 它支持该对象中的嵌套和混合types,因此它可以完全复制所提供的任何结构:PHP自动分析它并将其作为嵌套数组返回。 但是,有一个限制:括号[]不能是对象中任何键的一部分(如{"this [key] is problematic" : "hello world"} )。 如果有人知道如何正确摆脱它,请告诉!

简而言之,这里是来源:

 function getForm(url, target, values, method) { function grabValues(x) { var path = []; var depth = 0; var results = []; function iterate(x) { switch (typeof x) { case 'function': case 'undefined': case 'null': break; case 'object': if (Array.isArray(x)) for (var i = 0; i < x.length; i++) { path[depth++] = i; iterate(x[i]); } else for (var i in x) { path[depth++] = i; iterate(x[i]); } break; default: results.push({ path: path.slice(0), value: x }) break; } path.splice(--depth); } iterate(x); return results; } var form = document.createElement("form"); form.method = method; form.action = url; form.target = target; var values = grabValues(values); for (var j = 0; j < values.length; j++) { var input = document.createElement("input"); input.type = "hidden"; input.value = values[j].value; input.name = values[j].path[0]; for (var k = 1; k < values[j].path.length; k++) { input.name += "[" + values[j].path[k] + "]"; } form.appendChild(input); } return form; } 

我发现了一个更好的方法来传递参数到popup窗口,甚至从它检索参数:

在主页面:

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

在popup窗口中:

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

而已 !

这是非常方便的,因为:

  • 您不必在popup窗口的URL中设置参数。
  • 没有forms来定义
  • 你可以使用illimited参数甚至对象。
  • 双向:你可以传递参数AND,如果你想要的话,可以检索新的参数。
  • 很容易实现。

玩的开心!

默认提交Action是Ext.form.action.Submit,它使用Ajax请求将表单的值提交到configuration的URL。 要启用一个Ext表单的正常浏览器提交,请使用standardSubmit config选项。

链接: http : //docs.sencha.com/extjs/4.2.1/#!/api/Ext.form.Basic-cfg-standardSubmit

解决方法:把standardSubmit:true放在你的configuration中。 希望这会帮助你:)

我想在React中使用普通的Js和获取polyfill来做到这一点。 OP没有说他特别想创build一个表单并调用它的提交方法,所以我通过发布表单值为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() }