![](/img/trans.png)
[英]document.write(“anything”) does not execute in internet explorer as an external script
[英]Why does this document.write iframe ads code completely break Internet Explorer?
所以,我试图找到解决为什么会出现这个问题的答案; 我已经解决了这个问题,但我想知道它为什么会发生。
谷歌提供的使用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);
这解决了问题,但没有实际解释:
我已经解决了这个问题; 事实证明它与<iframe>
的内容无关。
事实证明,该页面由一个框架提供服务,该框架开始使用后端DOM解析器,由于可能与document.write
<script>
标记内存在</
原因相关,因此完全删除了</iframe
>结束标记从生成的页面,即使它保留在后端。 (它可能试图强制执行ETAGO规则)。
我能够重现它的原因是因为我正在复制生成的document.write
代码,而不是原始代码,并且从未注意到丢失的</iframe>
。 (而且我的“正常运行”的document.write代码没有被删除的</iframe>
标记,这让我相信问题是iframe
的内容。)
结果,浏览器在页面上解析了一个未关闭的<iframe>
标记,Internet Explorer不知道如何处理,并且在解析iframe时死了一部分(我仍然不完全确定原因)。
document.write()
阻止进一步的页面呈现,直到它完成。 我假设远程脚本需要一段时间才能加载,因此阻止了页面的其余部分加载。
我还假设Math.Random()函数没有帮助。
此外...谷歌的跟踪代码吓到我了...他们往往是丑陋的javascript黑客。
第一种方法应该缓慢的原因有两个。
您的解决方案有效,因为它创建的iframe在onload事件之后才会请求远程URL。 在第一个代码上设置超时后,您还可以加载页面,然后将远程URL的请求激活。
至于为什么代码的更改打破了网站,我似乎无法找到两者之间转移的任何速度差异。 也许它似乎更快,因为它被缓存了。
我不知道您网站的结构,但通常第一个脚本标记位于<head>
。 <head>
的iframe不会被渲染。 如果你做了document.body.getElementsByTagName('script')[0]
我会打赌你可能会遇到与你上面描述的问题类似的问题。
好像你有几个月前我遇到的类似问题。 document.write
触发并覆盖页面。 只需直接使用iframe
,一切都应该是犹太洁食。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.