繁体   English   中英

为什么这个document.write iframe广告代码完全打破了Internet Explorer?

[英]Why does this document.write iframe ads code completely break Internet Explorer?

所以,我试图找到解决为什么会出现这个问题的答案; 我已经解决了这个问题,但我想知道它为什么会发生。

TL; DR

谷歌提供的使用document.write注入iframe的转换跟踪代码突然导致页面停止在所有版本的Internet Explorer中执行,但通过使用非document.write方法注入相同的iframe进行了补救。

故事:

Doubleclick是一个广告网络,提供JavaScript代码段来跟踪广告的转化。

他们提供的代码片段如下所示:

<SCRIPT language="JavaScript">
var axel = Math.random()+"";
var a = axel * 10000000000000;
document.write('<IFRAME SRC="https://fls.doubleclick.net/activityi;src=143;type=donat01;cat=indir4;ord=1;num='+ a + '?" WIDTH=10 HEIGHT=10 FRAMEBORDER=0></IFRAME>');
</SCRIPT>
<NOSCRIPT>
<IFRAME SRC="https://fls.doubleclick.net/activityi;src=143;type=donat01;cat=indir4;ord=1;num=1?"
WIDTH=1 HEIGHT=1 FRAMEBORDER=0></IFRAME>
</NOSCRIPT>

现在,我知道,由于各种原因,document.write是危险的,应该避免。 但是,Google正在给我这个代码,所以,我认为我可以相信它。

它突然开始使用Internet Explorer打破所有用户的所有页面。 如同在页面中一样,页面在完成document.write会完全停止渲染。 这很疯狂:互联网上最大的第三方广告客户之一给了我一些JavaScript,这些JavaScript在我的流量中占据了25%的折扣!

作为分类,我使用Google Analytics中的注入技术快速​​替换了相同的代码:

var iframe = document.createElement('iframe');
iframe.src = //the URL;
iframe.width = 0;
iframe.height = 0;
iframe.frameborder = 0;
var ref = document.getElementsByTagName('script')[0];
ref.parentNode.insertBefore(iframe, ref);

这解决了问题,但没有实际解释:

为什么使用document.write注入的几乎空的iframe会破坏Internet Explorer,但上面的方法不行?

我已经解决了这个问题; 事实证明它与<iframe>的内容无关。

事实证明,该页面由一个框架提供服务,该框架开始使用后端DOM解析器,由于可能与document.write <script>标记内存在</原因相关,因此完全删除了</iframe >结束标记从生成的页面,即使它保留在后端。 (它可能试图强制执行ETAGO规则)。

我能够重现它的原因是因为我正在复制生成的document.write代码,而不是原始代码,并且从未注意到丢失的</iframe> (而且我的“正常运行”的document.write代码没有被删除的</iframe>标记,这让我相信问题是iframe的内容。)

结果,浏览器在页面上解析了一个未关闭的<iframe>标记,Internet Explorer不知道如何处理,并且在解析iframe时死了一部分(我仍然不完全确定原因)。

document.write()阻止进一步的页面呈现,直到它完成。 我假设远程脚本需要一段时间才能加载,因此阻止了页面的其余部分加载。

我还假设Math.Random()函数没有帮助。

此外...谷歌的跟踪代码吓到我了...他们往往是丑陋的javascript黑客。

第一种方法应该缓慢的原因有两个。

  • document.write()会阻塞,直到实际执行
  • 窗口的onload事件在其所有iframe以及这些iframe中的所有资源都已完全加载之前不会触发

您的解决方案有效,因为它创建的iframe在onload事件之后才会请求远程URL。 在第一个代码上设置超时后,您还可以加载页面,然后将远程URL的请求激活。

至于为什么代码的更改打破了网站,我似乎无法找到两者之间转移的任何速度差异。 也许它似乎更快,因为它被缓存了。

我不知道您网站的结构,但通常第一个脚本标记位于<head> <head>的iframe不会被渲染。 如果你做了document.body.getElementsByTagName('script')[0]我会打赌你可能会遇到与你上面描述的问题类似的问题。

好像你有几个月前我遇到的类似问题。 document.write触发并覆盖页面。 只需直接使用iframe ,一切都应该是犹太洁食。

我尝试复制你的问题,但不能在IE9上。

要么我没有正确的测试设置,或者IE 9之前的IE似乎有一些错误。 Firefox有一个类似的错误: https ://bugzilla.mozilla.org/show_bug.cgi id = 293633

也许它是未封闭的iframe和正在呈现的页面内部的组合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM