Выполнить запись в документе: невозможно записать в документ из асинхронно загруженного внешнего 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, если он явно не открыт.
Что это значит? И я должен делать что-то по-другому? Хотя я получаю ожидаемое поведение?
Ответы
Ответ 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 для рекламы и перенацеливания. Мне пришлось перенести эти сценарии из нижнего колонтитула и разместить их прямо на странице, и это исключило уведомление.