Не запускается отправка формы в динамическом iframe

#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, который я хотел.