Последнее обновление Firefox - выпуск Javascript - PullRequest
0 голосов
/ 06 ноября 2019

Я использую стороннее программное обеспечение, которое использует библиотеку Prototype. Он работал нормально до последнего обновления (версии 68 и выше) Firefox. Это все еще работает в других браузерах. Я пробовал отладку, и всякий раз, когда я вводил точку останова и шел шаг за шагом, код работал. Я нашел следующую строку кода, которая, если я перешагну и позволю этому коду запустить, проблема будет решена. Но если я разрешу запускать код до того, как возникнет эта проблема.

return formView.submit();

Есть идеи? Я в порядке с взломать даже.

Обновление:

Я создал MRE, как предложено. Вот ссылка https://brandsoftinfotech.com/test/firefox-frame-submit/

Я создал 2 формы, одну на родительской странице и одну в рамке. При отправке формы родительской страницы форма страницы фрейма отправляется и записывает данные в файл журнала. И страница формы при отправке просто показывает данные из этого файла журнала.

index.html

<!DOCTYPE html>
<html>
<head>
    <script>
        function submitFunction() {
            var myFrame = document.getElementById("myFrame");
            var myForm = myFrame.contentWindow.document.getElementById("myForm");
            myForm.submit();
        }
    </script>
</head>
<body>
    <form action="index-submit.php" onSubmit="submitFunction()">
        <input type="submit" value="Submit">
    </form>

    <iframe id="myFrame" src="frame-box.html"></iframe>
</body>
</html>

frame-box.html

<form action="frame-submit.php" id="myForm">
  First name:<br>
  <input type="text" name="firstname" value="Mickey"><br>
  Last name:<br>
  <input type="text" name="lastname" value="Mouse"><br><br>
</form>

Это прекрасно работает в Chrome, MS Edge, но не работает в Firefox.

Я не уверен, что решение этой проблемы решит мою проблему, но, по крайней мере, это должно работать, чтобы мой библиотечный код работал.

1 Ответ

1 голос
/ 14 ноября 2019

Я слегка удивлен, увидев, что он работает в любом браузере. Позволяя отправке родительской формы произойти, вы разрушаете страницу, что означает разрушение iframe, и любые запросы, которые могут выполняться, могут быть прерваны (или, если они не совсем запущены, никогда не начнутся).

Я бы, вероятно, переключился на ajax, а не на фактическую отправку формы.

Но если вы хотите сделать отправку формы, чтобы сделать это надежно, вам придется подождать, пока передача фрейма завершится, прежде чем делатьродительское представление. Самый простой способ сделать это - отправить фрейм с небольшой страницей с JavaScript на нем, которая сообщает родителю, что он закончил:

<!DOCTYPE html>
<html>
<body>
<script>
if (parent && parent.formCallback) {
    parent.formCallback();
}
</script>
</body>
</html>

Тогда родительская страница выглядит примерно так:

<!DOCTYPE html>
<html>
<head>
    <script>
        function submitFunction() {
            var myFrame = document.getElementById("myFrame");
            var myForm = myFrame.contentWindow.document.getElementById("myForm");
            myForm.submit();
            return false; // <−−−−−−−− cancel submission
        }
        function formCallback() {                            // 
            document.getElementById("parentForm").submit();  // <−−−−−−−− Submit on callback
        }                                                    // 
    </script>
</head>
<body>
    <!--  vvvvvvvvvvvvvvv−−−−−−−− Added ID    -->
    <form id="parentForm" action="/index-submit" onSubmit="return submitFunction()">
        <input type="hidden" name="index-field" value="x">
        <input type="submit" value="Submit">
    </form>

    <iframe id="myFrame" src="frame-box.html"></iframe>
</body>
</html>

Но вам может сойти с рук только обнаружение изменения местоположения в iframe. Для этого нужно просто изменить родительскую страницу, как указано:

<!DOCTYPE html>
<html>
<head>
    <script>
        function submitFunction(form) { // <−−−−−−−− Added parameter
            var myFrame = document.getElementById("myFrame");
            var myForm = myFrame.contentWindow.document.getElementById("myForm");
            myForm.submit();
            // Wait for the location of the iframe window to change
            setInterval(function() {
                if (String(myFrame.contentWindow.location).includes("frame-submit")) {
                    // Frame's form submitted, we can submit ours
                    form.submit();
                }
            }, 100);
            return false; // <−−−−−−−− cancel submission
        }
    </script>
</head>
<body>
    <form action="/index-submit" onSubmit="return submitFunction(this)">
    <!--                                                         ^^^^−−−−−−−−− added argument    -->
        <input type="hidden" name="index-field" value="x">
        <input type="submit" value="Submit">
    </form>

    <iframe id="myFrame" src="frame-box.html"></iframe>
</body>
</html>

Я бы не ожидал, что это сработает, если форма во фрейме будет значительно загружена (хотя я могу ошибаться в этом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...