Несколько документов.запись в iframe в Edge причина SCRIPT70: отказано в разрешении

#javascript #iframe #microsoft-edge

#javascript #iframe #microsoft-edge

Вопрос:

document.write вызывает ошибку SCRIPT70: отказано в разрешении, если вы используете несколько document.write внутри iframe. Эта ошибка возникает только в Edge. Во всех других браузерах эта ошибка не наблюдается. Например:

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SSP-558</title>
</head>
<body>
<script>
    document.write("1");
    document.write("2");
</script>
<script>
    var iframe = document.createElement("iframe");
    iframe.width = window.outerWidth;
    iframe.height = window.outerHeight;
    iframe.onload = function () {
        var doc = iframe.contentWindow.document;
        var script = doc.createElement("script");
        script.type = "text/javascript";
        script.text = [
            'document.write("1");',
            'document.write("2");'
        ].join("");

        doc.body.appendChild(script);
    };
    document.body.appendChild(iframe);
</script>
</body>
</html>
  

Этот код отобразит 12 на странице и в iframe, но это вызовет ошибку и отобразит только 1 внутри iframe в Edge.

Если вы используете только один document.write, все работает нормально. К сожалению, код, содержащий несколько document.write, принадлежит сторонним разработчикам, и они не могут его изменить.

Сталкивались ли вы с этой ошибкой и есть ли какое-либо решение для нее?

Комментарии:

1. что произойдет, если вы используете больше записей или совершенно другой js?. Если ничего не помогает, переместите содержимое iframe и js в отдельный html-файл и вызывайте его только из этого скрипта. Это должно предотвратить любые ошибки безопасности.

Ответ №1:

Было найдено решение. Если вы добавите окно перед document.write, ошибка не будет вызвана.

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SSP-558</title>
</head>
<body>
<script>
    document.write("1");
    document.write("2");
</script>
<script>
    var iframe = document.createElement("iframe");
    iframe.width = window.outerWidth;
    iframe.height = window.outerHeight;
    iframe.onload = function () {
        var doc = iframe.contentWindow.document;
        var script = doc.createElement("script");
        script.type = "text/javascript";
        script.text = [
            'window.document.write("1");',
            'window.document.write("2");'
        ].join("");

        doc.body.appendChild(script);
    };
    document.body.appendChild(iframe);
</script>
</body>
</html>
  

Комментарии:

1. самое смешное, что для первой записи не требуется a window.document , она работает без этого, но все остальные записи после этого нуждаются в оконной части … странно

2. Хотя я не использовал iframe, это также исправило мой SCRIPT70: отказано в разрешении при попытке использовать document.write(«) . Добавлено window.document.write(«) впереди, и это устранило ошибку.