Параметры window.open и pass по методу post
С методом window.open я открываю новый сайт с параметрами, которые мне нужно передать методом post.I нашел решение, но, к сожалению, оно не работает. Это мой код:
<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 пуст (конечно, я пытаюсь получить значения pass - Request.Form("b")
).
Как я могу решить эту проблему, почему я не могу получить значения pass?
Ответы
Ответ 1
Вместо того, чтобы писать форму в новое окно (что сложно понять, с кодировкой значений в 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>
Edit:
Чтобы динамически устанавливать значения в форме, вы можете сделать следующее:
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');
.
Примечание. Я изменил имена параметров в отношении имен форм, чтобы показать, что они не должны быть одинаковыми. Обычно вы будете держать их похожими друг на друга, чтобы упростить отслеживание значений.
Ответ 2
Поскольку вам нужна вся форма внутри 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();
Ответ 3
Даже если я опаздываю на 3 года, но для упрощения примера Гуффа вам даже не нужно иметь форму на странице:
$('<form method="post" action="test.asp" target="TheWindow">
<input type="hidden" name="something" value="something">
...
</form>').submit();
Может быть, полезный совет для кого-то:)
Ответ 4
Я полностью согласен с mercenary ответом, опубликованным выше, и создал эту функцию для меня, которая работает для меня. Это не ответ, это комментарий к сообщению выше 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);
}
Ответ 5
Вы можете просто использовать target="_blank"
в форме.
<form action="action.php" method="post" target="_blank">
<input type="hidden" name="something" value="some value">
</form>
Добавьте скрытые входы так, как вы предпочитаете, а затем просто отправьте форму с помощью JS.
Ответ 6
Я создал функцию для создания формы на основе url, target и объекта в качестве метода данных и отправки POST
/GET
. Он поддерживает вложенные и смешанные типы внутри этого объекта, поэтому он может полностью реплицировать любую структуру, которую вы ее кормите: 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;
}
Ответ 7
Я нашел лучший способ передать параметры во всплывающее окно и даже извлечь из него параметры:
На главной странице:
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-адрес всплывающего окна.
- Нет формы для определения
- Вы можете использовать неограниченные параметры даже для объектов.
- Двунаправленный: вы можете передавать параметры И, если вы хотите, можете получить новые параметры.
- Очень легко реализовать.
Удачи!
Ответ 8
Представляемое по умолчанию действие - это Ext.form.action.Submit, который использует запрос Ajax для отправки значений формы в настроенный URL. Чтобы включить обычную отправку формы внешнего вида, используйте параметр конфигурации standardSubmit.
Ссылка: http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.form.Basic-cfg-standardSubmit
Решение: поставьте standardSubmit: true в вашей конфигурации. Надеюсь, что это вам поможет:)
Ответ 9
Я хотел сделать это в React, используя простые Js и fetch polyfill.
OP не сказал, что он специально хотел создать форму и вызвать метод отправки на ней, поэтому я сделал это, разместив значения формы как 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()
}
Ответ 10
Я использовал это в прошлом, так как мы обычно используем синтаксис бритвы для кодирования
@using (Html.BeginForm("actionName", "controllerName", FormMethod.Post, new { target = "_blank" }))
{
//добавить скрытый и заполненный здесь бланк
}