Трудно отладить ситуацию (или ошибку) в Opera - PullRequest
1 голос
/ 14 июля 2011

Хорошо, я сделаю все возможное.

Есть эта страница http://tiu.ru/image/tmp/test_2.html, которая в Opera выглядит иначе, чем в Chrome и Firefox (возможно, других).

Он оценивает javascript-код внутри <div></div>, который document.write("") обрабатывает фрагмент другого HTML-кода с <script>, который оценивает JS-код, который просит Google Ads написать рекламу.

Google Ads записывает свой контейнер и контент контейнера (который загружает рекламу с Яндекса) ((возможно, вам придется отключить блокировку рекламы, чтобы увидеть рекламу, но вы можете просто просмотреть скриншот)).

И проблема в том, что в Opera он как-то пишет этот контент вне оригинального div.

Скриншот результата для Chrome: enter image description here Скриншот результата для Opera: enter image description here

Если вы возьмете этот код внутри document.write() и поместите его как обычный HTML-код - все работает хорошо. Смотри http://tiu.ru/image/tmp/test_3.html

Я не могу понять, как отлаживать этот код объявлений Google, поэтому я прошу помощи. Спасибо.

p.s .: вы можете сохранить страницу где-нибудь на localhost и открыть ее, реклама не будет загружена, но дерево DOM будет таким же неправильным.

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Ну, вы добавляете тег script с document.write (), который выполняет document.write (), чтобы добавить тот, который вызывает GA_googleFillSlot, который сам выполняет document.write (), чтобы добавить SCRIPT с установленным SRC для двойного щелчка. Сетевой URL, который вызывает google_ads.js для запуска другого document.write (), который добавляет встроенный SCRIPT, содержащий другой вызов document.write () для добавления другого внешнего скрипта, на этот раз загружая context.js из an.yandex.ru, и похоже, что context.js также содержит код для добавления еще двух внешних скриптов в документ. Но в этот момент повреждение уже произошло: хотя загружающий внешний скрипт, вставленный с document.write (), должен блокировать синтаксический анализ, что-то странное происходит, когда скрипт doubleclick.net загружается и вызывает обратно в google_ads.js, что заставляет Opera закрывать родительский DIV.

Давайте посмотрим, как выглядит DOM в тот момент, когда DoubleClick перезванивает google_ads - установив точку останова в GA_googleSetAdContentsBySlotForSync и используя Opera Dragonfly. Итак, после ввода этого сценария DOM все еще в порядке, DIV не закрывается, но когда этот поток сценариев выполняет document.write () для добавления <div id=google_ads_div_ru__context_informers_addon_360x90_ad_container> с комментариями, разметкой и скриптами внутри, что-то об этом новом контенте заставляет Opera полагать, что ей нужно закрыть прежний document.write () - вставленный DIV. Я полагаю, что это ошибка синтаксического анализа, глубоко связанная с обработкой нескольких вложенных document.write ().

Это будет хорошо работать с грядущим HTML5-парсером Opera. Если это вообще возможно для вас, не беспокойтесь об этом и подождите, пока Opera 12 не разберется со всем этим.

2 голосов
/ 14 июля 2011

Опера имеет строгий XHTML-парсер. Попробуйте обернуть ваш JavaScript в теги CDATA, чтобы анализатор игнорировал символы < и &, а также любые другие недопустимые символы в вашем сценарии:

<script type="text/javascript">
/* <![CDATA[ */

  // put your js code here

/* ]]> */
</script>
...