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