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

Yah*_*hel 13 html javascript internet-explorer document.write

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

TL; DR

Google提供的转化跟踪代码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>
Run Code Online (Sandbox Code Playgroud)

现在,我知道,由于各种原因,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);
Run Code Online (Sandbox Code Playgroud)

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

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

Yah*_*hel 8

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

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

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

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