Выполнить запись в 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 ответа:
Асинхронно загруженный сценарий, скорее всего, будет запущен после того, как документ будет полностью проанализирован и закрыт. Таким образом, вы не можете использовать
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 для рекламы и ретаргетинга. Мне пришлось переместить эти сценарии из нижнего колонтитула и поместить их прямо на страницу, и это устранило уведомление.