javascript document.write во внешнем js-файле - PullRequest
9 голосов
/ 25 ноября 2008

Работая над большим, высоконагруженным проектом, я получил проблему, которая уже описана в миллиарде тем на форумах и блогах, но в моем случае нет решения, которое бы помогло. Вот история.

У меня есть HTML-код баннера, я не знаю, что это за код. Иногда это обычный HTML, но иногда это тег <script> с document.write внутри него с тегом <script>, в котором есть src для двойного щелчка по сети.

Итак, у нас есть: script> document.write> script (двойной щелчок).

Сеть двойного клика, как вы, возможно, знаете, также использует document.write, и большую часть времени они дают флеш-баннеры, которые должны загрузить еще один файл js.

Итак, в конце концов мы имеем: script> document.write> script (двойной щелчок)> document.write> script> ...

Это хорошо работает, когда вы помещаете его в HTML напрямую. Рендеринг страницы 1 часть, загрузка banner1, продолжение рендеринга страницы, загрузка banner2, завершение рендеринга страницы.

Но сейчас мне нужно сначала отобразить страницу и только после этого загружать баннеры. Поскольку баннер использует document.write, мне нужно загрузить его до события window.onload (примечание: после window.onload document.write перепишет весь документ.)

Что я сделал:

В разделе заголовка у меня есть объект баннеров (реальное пространство имен типа :)) с областью действия.

Когда выполняется рендеринг страницы и код баннера, я помещаю код баннера в область видимости и помещаю <div id="bannerPlaceHolder"+id></div> - поэтому здесь мне нужно будет поместить содержание баннера позже на

Страница отображается и перед тегом </body> я помещаю метод <script>banners.load()</script> banner.load, чтобы сделать это для каждого элемента в массиве области действия:

document.write('<div id="codeHolder'+id+'">');
document.write(bannerCode);
document.write('</div>');

И только после этого у меня есть window.onload() событие, которое делает это:

взять все баннеры codeHolders и узел за узлом и добавить его узлы из codeHolder в placeHolder, поэтому в результате я загрузил баннеры после рендеринга страницы, и баннеры оказались в нужных местах.

Все отлично, кроме IE, он загружает любой js-скрипт, который был вставлен в DOM динамически асинхронным способом, поэтому document.write внутри скриптов doubleclick добавляет узлы в конец документа, а не в мои узлы codeHolder. Как обычно, это только в IE.

Я буду очень признателен всем, кто знает решение.

Ответы [ 6 ]

3 голосов
/ 29 декабря 2009

Вам нужно writeCapture.js (полное раскрытие: я автор). Все ставки сделаны со сторонними сценариями. Сегодня они используют document.write для генерации определенного HTML-кода, но завтра они могут изменить его, и любые простые хаки, основанные на замене document.write, должны быть обновлены. writeCapture позаботится об этом. Ваше использование будет что-то вроде:

$('#bannerPlaceHolder').writeCapture().html('<script type="text/javascript" src="http://doubleclick.net/bannerCode.js"></script>');

Библиотека может обрабатывать любую произвольную глубину тегов сценария и прекрасно работает с вкрапленным HTML. Он также имеет автономную сборку, если вы не используете jQuery.

1 голос
/ 12 декабря 2008

Как правило, с баннерами вы будете знать точные размеры и размещение, так как насчет динамического создания iframe с контентом, который у вас есть в bannerCode, и это все.

0 голосов
/ 23 сентября 2009

Разделить document.write () - вызовы в отдельных -tags, поэтому вывод должен выглядеть следующим образом:

document.write ( ''); document.write (bannerCode);

document.write ( '');

IE будет ждать, когда document.write (bannerCode) будет готов и когда записывает закрывающий -tag.

0 голосов
/ 22 апреля 2009

Я думаю, что решение iframe ужасно. Почему вы не можете загрузить баннеры на отдельную страницу и AJAX их в DIV?

0 голосов
/ 17 февраля 2009

загрузите его в скрытый (размер 0x0) iframe, затем переместите его в другое место с помощью javascript

0 голосов
/ 25 ноября 2008

возможно, вы могли бы использовать свойство innerHTML: document.getElementById ( "х") innerHTML = ".................";.

Или вы можете использовать DOM: CreateElement и AppendChild

...