13

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

TL;博士

谷歌提供的转换跟踪代码使用注入 iframedocument.write突然导致页面停止在所有版本的 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 是危险的,应该避免。但是,谷歌给了我这个代码,所以,我想我可以相信它。

它突然开始破坏我们所有使用 Internet Explorer 的用户的所有页面。例如,页面一旦点击document.write. 这太疯狂了:互联网上最大的第三方广告商之一给了我 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,但上面的这种方法却没有?

4

6 回答 6

8

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

事实证明,该页面是由一个开始使用后端 DOM解析器的</框架提供服务的,由于可能与.后端。(它可能试图执行ETGO规则)。<script>document.write</iframe

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

结果,浏览器<iframe>在页面上解析了一个未关闭的标签,Internet Explorer 不知道如何处理,并在 iframe 的解析过程中死掉了(我仍然不完全确定为什么)。

于 2011-07-11T00:23:35.673 回答
0

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

我还假设 Math.Random() 函数无济于事。

另外……谷歌的跟踪代码吓到我了……它们往往是丑陋的 javascript 黑客。

于 2011-07-05T12:21:28.590 回答
0

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

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

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

至于为什么更改代码会破坏网站,我似乎找不到两者之间的任何速度差异。也许它看起来更快,因为它被缓存了。

于 2011-07-05T14:11:16.897 回答
0

我尝试复制您的问题,但无法在 IE9 上复制。

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

也许它是未关闭的 iframe 和正在呈现的页面内的某些内容的组合。

于 2011-07-11T03:45:12.940 回答
0

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

于 2011-07-06T15:01:21.707 回答
0

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

于 2011-07-06T15:04:57.107 回答