Javascript document write positioning

JavaScript – контроль точки вставки для document.write

Я хотел бы создать страницу с третьей стороной script, которая включает document.write после полной загрузки DOM.

Моя страница не XHTML. Моя проблема в том, что document.write перезаписывает мою собственную страницу. (это то, что он делает после загрузки DOM).

Я попытался переопределить функцию document.write(аналогично http://ejohn.org/blog/xhtml-documentwrite-and-adsense/), но это не касается случаев, когда документ .write содержит частичные теги.

Пример, который нарушил бы приведенный выше код:

Есть ли способ изменить точку ввода document.write через JavaScript? Кто-нибудь лучше знает, как это сделать?

Если вы имеете дело со сторонними скриптами, просто заменить document.write, чтобы захватить вывод и вставить его в нужное место, недостаточно, так как они могут изменить script, а затем ваш сайт сломается.

writeCapture.js делает то, что вам нужно (полное раскрытие: я автор). Он в основном перезаписывает теги script, так что каждый из них захватывает свой собственный вывод document.write и помещает его в нужное место. Использование (с использованием jQuery) было бы чем-то вроде:

$(document.body).writeCapture().append(''); 

Здесь я предполагаю, что вы хотите добавить конец тела. Все селектора jQuery и методы манипуляции будут работать с плагином, поэтому вы можете вводить его в любом месте и, тем не менее, хотите. Он также может использоваться без jQuery, если это проблема.

Можно переопределить метод document.write. Таким образом, вы можете буферизовать строки, отправленные на document.write, и выводить буфер везде, где хотите. Однако изменение a script от синхронного к асинхронному может привести к ошибкам, если не обрабатываться правильно. Вот пример:

Упрощенная замена document.write

(function() < // WARNING: This is just a simplified example // to illustrate a problem. // Do NOT use this code! var buffer = []; document.write = function(str) < // Every time document.write is called push // the data into buffer. document.write can // be called from anywhere, so we also need // a mechanism for multiple positions if // that needed. buffer.push(str); >; function flushBuffer() < // Join everything in the buffer to one string and put // inside the element we want the output. var output = buffer.join(''); document.getElementById("ad-position-1").innerHTML = output; >// Inject the thid-party script dynamically and // call flushBuffer when the script is loaded // (and executed). var script = document.createElement("script"); script.onload = flushBuffer; script.src = "http://someadserver.com/example.js"; >)(); 
var flashAdObject = ". "; document.write(" "); // Since we buffer the data the getElementById will fail var example = document.getElementById("example"); example.innerHTML = flashAdObject; // ReferenceError: example is not defined 

Я документировал различные проблемы, с которыми я столкнулся при написании и использовании моей замены document.write: https://github.com/gregersrygg/crapLoader/wiki/What-to-think-about-when-replacing-document.write

Читайте также:  User agent header java

Но опасность использования замены document.write – это все неизвестные проблемы, которые могут возникнуть. Некоторые даже не могут обойтись.

document.write(""); adLib.doSomething(); // ReferenceError: adLib is not defined 

К счастью, я не сталкивался с вышеупомянутой проблемой в дикой природе, но это не гарантирует, что этого не произойдет;)

По-прежнему хотите попробовать? Попробуйте crapLoader (мой) или writeCapture

Вы также можете проверить дружественные iframes. В основном он создает одинаковый домен iframe и загружает все там, а не в вашем документе. К сожалению, я еще не нашел хороших библиотек для обработки.

Оригинальный ответ перед редактированием:

В основном проблема document.write заключается в том, что она не работает в документах XHTML. Наиболее широкое решение тогда (как это может показаться суровым) – не использовать XHTML/xml для вашей страницы. Из-за IE + XHTML и проблема с mimetype, Google Adsense нарушает (может быть, хорошо:), и общий переход к HTML5 я не Думаю, это так плохо, как кажется.

Однако, если вы действительно хотите использовать XHTML для своей страницы, то John script, с которым вы связаны, – это лучшее, что у вас есть на данный момент. Просто понюхайте IE на сервере. Если запрос из IE, ничего не делайте (и не выполняйте mimetype application/xhtml+xml !). В противном случае переместите его на вашей страницы, и вы отправитесь на гонки.

Перечитав свой вопрос, есть ли у вас конкретная проблема с Джоном script? Известно, что он не работает в Safari 2.0, но об этом.

Вам может быть интересна библиотека Javascript, которую я разработал, которая позволяет загружать сторонние скрипты, используя document.write после window.onload. Внутри библиотека переопределяет document.write, динамически добавляет элементы DOM, запускает любые включенные скрипты, которые также могут использовать document.write.

Читайте также:  Python типы данных long

В отличие от решения Джона Ресига (который был частью вдохновения для моего собственного кода), модуль, который я разработал, поддерживает частичную запись, такую ​​как пример, который вы передаете с помощью div:

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

Done here

» вместо трех раз с частичной разметкой.

FWIW, я нашел postscribe, чтобы быть лучшим вариантом в наши дни – он обрабатывает обманчивый модуль рендеринга рекламы, как шарм позволяя нашей странице загружаться без блокировки.

Чтобы изменить содержимое страницы после рендеринга DOM, вам нужно либо использовать библиотеку javascript для добавления HTML или текста в определенные моменты (jQuery, mootools, prototype,…) или просто использовать innerHTML свойство каждого элемента DOM изменить/добавить текст к нему. Это работает crossbrowser и не требует каких-либо библиотек.

Есть лучшие способы сделать это.
2 пути

Источник

Javascript document write positioning

&#9733 Несколько слов о методе document.write() &#9733 Как вывести текст с помощью document.write() &#9733 Идентификатор в коде вывода document.write()&nbsp&nbspперейти &#8595 &#9733 Перенос строки в методе document.write()&nbsp&nbspперейти &#8595 &#9733 Как вывести картинку методом document.write()&nbsp&nbspперейти &#8595 &#9733 Как скрыть и снова отобразить картинку методом document.write()&nbsp&nbspперейти &#8595 &#9733 Вывод числовой переменной методом document.write&nbsp&nbspперейти &#8595 &#9733 Текст в рамке методом document.write()&nbsp&nbspперейти &#8595 &#9733 Новое окно JavaScript и метод document.write()&nbsp&nbspперейти &#8595 &#9733 Открытие и закрытие нового окна &#9733 Вид нового окна &#9733 Имя нового окна &#9733 Фон нового окна, размер нового окна &#9733 Вывод текста, рисунка и таблицы в новом окне &#9733 Увеличение размера изображения в новом окне &#9733 Изменение шрифта в новом окне &#9733 Задержка в новом окне &#9733 Ссылка в новом окне &#9733 Внутренний стиль CSS в новом окне &#9733 Таблица с помощью метода document.write()&nbsp&nbspперейти &#8595 &#9733 Принцип создания таблицы &#9733 Таблица с несколькими ячейками &#9733 Динамическое изменение содержимого ячейки &#9733 document.write и CSS&nbsp&nbspперейти &#8595 &#9733 document.write в новом окне CSS&nbsp&nbspперейти &#8595

Читайте также:  Парсинг json строки java

Вывод изображения по ссылке

Выполнение кодов, записанных в body родительского окна

Щелкни по строке, потом еще раз

Оглавление (простые скрипты для основных приложений JavaScript)

Источник

Document.write()

Пишет строку в поток документа, открытый с помощью document.open() (en-US) .

Примечание: Замечание: поскольку document.write пишет строку в поток документа, вызов document.write для закрытого (но загруженного) документа автоматически вызовет document.open , который очистит документ (en-US) .

Синтаксис

Параметры

Строка, содержащая текст для записи в документ.

Пример

html> head> title>write exampletitle> script> function newContent()  alert("загрузка нового контента"); document.open(); document.write("

Долой старое, да здравствует новое!

"
); document.close(); >
script> head> body onload="newContent();"> p>Какой-то оригинальный контент.p> body> html>

Замечания

Запись в документ, загруженный без вызова document.open(), автоматически вызовет document.open . По окончании записи рекомендуется вызвать document.close(), чтобы браузер завершил загрузку страницы. Записываемый текст разбирается в структурную модель документа. В примере выше элемент h1 становится узлом документа.

Если вызов document.write() производится во встроенном HTML теге , вызов document.open() не будет выполнен . Например:

script> document.write("

Основной заголовок

"
)
script>

Примечание: document.write и document.writeln не работают в XHTML документах (выводится сообщение «Операция не поддерживается» [ NS_ERROR_DOM_NOT_SUPPORTED_ERR ] в консоли ошибок). Это случается при открытии локального файла с расширением .xhtml или для любых документов, обрабатываемых с типом MIME — application/xhtml+xml . Больше информации доступно по адресу W3C XHTML FAQ.

Примечание: document.write в отложенных или асинхронных сценариях игнорируется и выводится сообщение типа «Проигнорирован вызов document.write() из асинхронно загруженного внешнего сценария» в консоли ошибок.

Примечание: В Edge вызов document.write в iframe более одного раза приводит к ошибке SCRIPT70: Доступ запрещён.

Примечание: Начиная с версии 55, Chrome не исполняет элементы вставленные посредством document.write() в случае отсутствия кеша HTTP для пользователей 2G подключения.

Спецификации

Смотрите также

Found a content problem with this page?

This page was last modified on 11 февр. 2023 г. by MDN contributors.

Your blueprint for a better internet.

Источник

Оцените статью