#javascript
#javascript
Вопрос:
Обновить
проблема не в iframe, проблема в том, что форма не отправляется функцией onsubmit, которая отправляет json. Цель состоит в том, чтобы динамически создавать iframe, который перенаправляет с помощью form post на другой URL с json-содержимым тега script выше.
Оригинал
У меня есть следующее на примере веб-сайта:
<script data-dashboard="true" type="application/json">
{
"title":"Serverless Identity"
}
</script>
<script type="text/javascript">
let dashboardConfiguration = document.querySelector("script[data-dashboard="true"]");
if (dashboardConfiguration) {
let iframe = document.createElement("iframe");
let model = JSON.stringify(JSON.parse(dashboardConfiguration.innerHTML.trim()));
document.body.appendChild(iframe);
var doc = iframe.contentWindow.document;
doc.open()
doc.writeln(`<form id="form" action="https://localhost:44338/dashboard/" method="POST" target="_self"></form>`)
doc.close();
iframe.onload = () => {
let form = doc.getElementById("form");
form.addEventListener("submit", (e) => {
console.log(model);
e.preventDefault();
// construct an HTTP request
var xhr = new XMLHttpRequest();
xhr.open(form.method, form.action, true);
xhr.setRequestHeader('content-type', 'application/json; charset=UTF-8');
// send the collected data as JSON
xhr.send(model);
xhr.onloadend = function () {
// done
};
});
form.submit();
}
};
</script>
Я также пробовал с onsubmit
с тем же результатом, что и при обычной отправке.
Комментарии:
1.
onload
Событие для IFRAMEs ненадежно. Также вам не следует использовать функции со стрелками для прослушивателей событий — попробуйтеonsubmit
использовать обычную функцию (что-то вроде<form onsubmit="return ajaxSubmit(event)">
, а затем верните false в этой функции)2. ни одно из ваших предложений ничего не изменило.
3. Итак, вы создаете форму, добавляете к этой форме обработчик отправки, отправляете эту форму из скрипта, а затем выполняете AJAX-запрос внутри обработчика отправки. Почему? Почему бы просто не выполнить AJAX-запрос и покончить с этим, какова цель этой формы …?
4. Вы не можете перенаправить страницу без формы?
Ответ №1:
Это невозможно,
при использовании form.submit()
любые обработчики onsubmit не будут запускаться, согласно спецификации.
Я использовал другой подход к отправке обычной формы отправки с использованием значений в кодировке формы с полезной нагрузкой hole в одном скрытом поле и десериализовал ее на стороне сервера.
Ответ №2:
Когда вы создали iframe, затем он загружен, а затем вы привязываете onload, вместо этого вы должны использовать DOMNodeInserted событие в теле, когда iframe добавляется к телу, например
let iframe = document.createElement("iframe");
let model = JSON.stringify(JSON.parse(dashboardConfiguration.innerHTML.trim()));
document.body.addEventListener("DOMNodeInserted", function (ev) {
//write your logic here
});
document.body.appendChild(iframe);
var doc = iframe.contentWindow.document;
Комментарии:
1. Обновлен вопрос, чтобы более конкретно рассказать о проблеме. Проблема не в выгрузке.
2. w3schools.com/code/tryit.asp?filename=G2RSPN5BUEL5 Вы можете проверить этот подход, чтобы получить свой результат
3. Выполняется отправка обычной формы, а не json post.
Ответ №3:
Удалить iframe.onload = () => { }
. Проверьте вкладку Chrome network
. Запускается URL формы https://localhost:44338/dashboard/
.
<script data-dashboard="true" type="application/json">
{
"title":"Serverless Identity"
}
</script>
<script type="text/javascript">
let dashboardConfiguration = document.querySelector("script[data-dashboard="true"]");
if (dashboardConfiguration) {
let iframe = document.createElement("iframe");
let model = JSON.stringify(JSON.parse(dashboardConfiguration.innerHTML.trim()));
document.body.appendChild(iframe);
var doc = iframe.contentWindow.document;
doc.open()
doc.writeln(`<form id="form" action="https://localhost:44338/dashboard/" method="POST" target="_self"></form>`)
doc.close();
let form = doc.getElementById("form");
form.addEventListener("submit", (e) => {
console.log(model);
e.preventDefault();
// construct an HTTP request
var xhr = new XMLHttpRequest();
xhr.open(form.method, form.action, true);
xhr.setRequestHeader('content-type', 'application/json; charset=UTF-8');
// send the collected data as JSON
xhr.send(model);
xhr.onloadend = function () {
// done
};
});
form.submit();
}
Комментарии:
1. Да, она запускается, но с обычной формой отправки, а не с xhr json post, который я хотел.