Подтвердить что ты не робот

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

Я пытаюсь загрузить определенный script после загрузки страницы, примерно так:

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;

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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>';

Ответ 2

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

Ответ 3

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