2008-11-24 8 views
9

Работа над большим, загруженным проектом У меня возникла проблема, которая уже описана в миллиардах тем на форумах и блоге, но нет решения, которое поможет в моем случае. Вот история.javascript document.write in external js file

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

У нас есть: script> document.write> script (doubleclick).

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

Так ведь у нас есть: сценарий> document.write> скрипт (DoubleClick)> document.write> сценарий> ...

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

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

Что я сделал:

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

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

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

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

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

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

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

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

ответ

0

Возможно, вы можете использовать свойство innerHTML: document.getElementById ("x"). InnerHTML = ".................";

Или вы могли бы вам DOM: CreateElement и AppendChild

+0

innerHTML не выполняет код в <'script> теги динамически Я не могу создать сценарий, поскольку код html, который поставляется, не может управляться – 2008-11-24 21:41:28

1

Обычно с баннерами вы будете знать точные размеры и размещение, так как о создании IFRAME динамически с содержанием того, что вы имеете в bannerCode и все ,

0

загрузить его в скрытом (размере 0х0) фрейм, а затем переместить его в другом месте с яваскриптом

0

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

0

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

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

document.write ('');

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

3

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

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

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