Выполнить запись в doc: невозможно выполнить запись в документ из асинхронно загруженного внешнего скрипта, если он не открыт явно.


Я пытаюсь загрузить определенный скрипт после выполнения загрузки страницы, что-то вроде этого:

function downloadJSAtOnload(){
            var element = document.createElement("script");
            element.src = "scriptSrc";
            document.body.appendChild(element);
        }

         if (window.addEventListener)
                  window.addEventListener("load", downloadJSAtOnload, false);
            else if (window.attachEvent)
                  window.attachEvent("onload", downloadJSAtOnload);
            else window.onload = downloadJSAtOnload;

И хотя этот скрипт, похоже, выполняет и загружает 'scriptSrc', и добавляет его прямо перед концом тега body, он выдает следующее сообщение (не ошибка) в консоли (chrome)

не удалось выполнить 'write' на 'Document': невозможно выполнить запись в документ из асинхронно загруженного внешнего скрипта, если он явно не открыт.

Что это вообще значит? И я должен сделать что-то по-другому? Даже если я получу ожидаемое поведение?

3 55

3 ответа:

Асинхронно загруженный сценарий, скорее всего, будет запущен после того, как документ будет полностью проанализирован и закрыт. Таким образом, вы не можете использовать document.write() из такого скрипта (ну технически вы можете, но он не будет делать то, что вы хотите).

Вам нужно будет заменить любые операторы document.write() в этом скрипте явными манипуляциями DOM, создав элементы DOM и затем вставив их в определенный родитель с помощью .appendChild() или .insertBefore() или установив .innerHTML или какой-либо механизм для прямой манипуляции DOM, такой как тот.

Например, вместо этого типа кода в встроенном скрипте:

<div id="container">
<script>
document.write('<span style="color:red;">Hello</span>');
</script>
</div>

Это можно использовать для замены встроенного скрипта выше в динамически загружаемом скрипте:

var container = document.getElementById("container");
var content = document.createElement("span");
content.style.color = "red";
content.innerHTML = "Hello";
container.appendChild(content);

Или, если в контейнере не было другого содержимого, которое вам нужно было просто добавить, вы могли бы просто сделать это:

var container = document.getElementById("container");
container.innerHTML = '<span style="color:red;">Hello</span>';

Немного опоздал на вечеринку, но Крукс создал для этого сценарий под названиемPostscribe . Мы смогли использовать это, чтобы обойти эту проблему.

На случай, если это кому-то пригодится, у меня была такая же проблема. Я вносил нижний колонтитул на веб-страницу через jQuery. Внутри этого нижнего колонтитула были некоторые сценарии Google для рекламы и ретаргетинга. Мне пришлось переместить эти сценарии из нижнего колонтитула и поместить их прямо на страницу, и это устранило уведомление.