很难在Opera中调试情况(或错误)

时间:2011-07-14 15:38:13

标签: javascript html dom opera

好的,我会尽我所能。

有这个页面http://tiu.ru/image/tmp/test_2.html,在Opera和Chrome和Firefox(可能是其他人)中看起来不同。

评估<div></div>内的javascript代码,该代码执行document.write("")的另一个HTML代码<script>,用于评估要求Google广告撰写广告的JS代码。

谷歌广告写了它的容器和容器的内容(从Yandex加载广告)((可能你需要禁用adblock才能看到广告,但你只能查看截图)。)

问题是在Opera中它以某种方式将内容写在原始div之外。

Chrome的结果屏幕截图:enter image description here Opera的结果屏幕截图:enter image description here

如果您将代码放在document.write()中并将其放置为通常的HTML代码 - 一切正常。见http://tiu.ru/image/tmp/test_3.html

我无法弄清楚如何调试谷歌广告代码,这就是我寻求帮助的原因。谢谢。

p.s。:您可以将页面保存到localhost并打开它,不会加载广告,但DOM树也会出错。

非常感谢!

2 个答案:

答案 0 :(得分:3)

好吧,你添加一个带有document.write()的脚本标签来执行document.write()来添加一个调用GA_googleFillSlot的脚本标签,GA_googleFillSlot本身会执行document.write()来添加一个设置为双击的SRC的SCRIPT。 net URL调用google_ads.js来触发另一个document.write(),它添加一个包含另一个document.write()调用的内联SCRIPT来添加另一个外部脚本,这次从an.yandex.ru加载context.js,看起来context.js还包含为文档添加两个外部脚本的代码。但是在这一点上已经发生了损坏:尽管使用document.write()插入的加载外部脚本应该阻止解析,但是当doubleclick.net脚本加载并调用回google_ads.js使Opera关闭父DIV时会发生奇怪的事情。

通过在GA_googleSetAdContentsBySlotForSync中设置断点并使用Opera Dragonfly,让我们看看DoubleClick在回调google_ads时的情况。我们去了:在输入这​​个脚本时,DOM仍然没问题,DIV没有关闭 - 但是当这个脚本线程做document.write()以添加带有注释,标记和脚本的<div id=google_ads_div_ru__context_informers_addon_360x90_ad_container>时,关于那个新内容使Opera认为需要关闭以前的document.write() - 插入DIV。我想这是处理多个嵌套的document.write()的深层解析错误。

这将适用于Opera即将推出的HTML5解析器。如果你可能的话,不要担心它,等到Opera 12对它进行整理。

答案 1 :(得分:2)

Opera有一个严格的XHTML解析器。尝试将您的javascript包装在CDATA标记中,以便解析器忽略<&个字符以及脚本中的任何其他非法字符:

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

  // put your js code here

/* ]]> */
</script>