我创建了一个简单的 HTML 页面,iframe
其src
属性引用了包含页面——换句话说,一个自引用 iframe。
这个.html
<html>
<head></head>
<body>
<iframe src="this.html"></iframe>
</body>
</html>
为什么这不会无限循环并使我的浏览器崩溃?另外,为什么连 IE 都不会崩溃呢?
(注意:这源于团队讨论使用 iframe 解决问题的优点和缺点。你知道,“镜子中的镜子”之类的。)
我创建了一个简单的 HTML 页面,iframe
其src
属性引用了包含页面——换句话说,一个自引用 iframe。
这个.html
<html>
<head></head>
<body>
<iframe src="this.html"></iframe>
</body>
</html>
为什么这不会无限循环并使我的浏览器崩溃?另外,为什么连 IE 都不会崩溃呢?
(注意:这源于团队讨论使用 iframe 解决问题的优点和缺点。你知道,“镜子中的镜子”之类的。)
W3C 在 1997 年解决了这个问题,在“实现 HTML 框架”中解释了应该如何实现框架:
任何试图将其任何祖先使用的 URL 分配为其 SRC 的框架都被视为根本没有 SRC URL(基本上是一个空白框架)。
正如 kingdago 发现并在上面的评论中提到的那样,1999年的 Mozilla 是Mozilla错过了为此实施保护措施的一个浏览器。引用其中一位开发人员的话:
这是一个奇偶校验错误(并且可能是尴尬的根源),因为 MSIE5 对这些类型的页面没有问题。
我决定对此进行深入研究,结果在2004 年再次发生了这种情况。但是,这次涉及到JavaScript :
这是代码,是什么原因造成的: <iframe name="productcatalog" id="productcatalog" src="page2.htm"></iframe> 后跟一个脚本:frames.productcatalog.location.replace (frames.productcatalog.location + location.hash);
...
实际结果:父窗口被递归加载到 iframe 中,有时会导致崩溃。
预期结果:就像在 Internet Explorer 中一样显示它。
然后在2008 年再次使用Firefox 2(这也涉及 JavaScript)。
2009年又一次。_ 这里有趣的部分是这个错误仍然是开放的,并且这个附件:(你会抑制你的好奇心吗?)仍然会崩溃/冻结你的 Firefox(我刚刚测试过它,我几乎让整个 Ubuntu 崩溃了)。在 Chrome 中,它只是无限期地加载(可能是因为每个选项卡都位于一个单独的进程中)。https://bugzilla.mozilla.org/attachment.cgi?id=414035
至于其他浏览器:
我想在“另外,为什么连 IE 都不会崩溃?”中添加一些内容。问题的一部分。IE没有让我们失望...
如果您将简单的迭代次数作为查询字符串添加到嵌套 iFrame 的 src Firefox 中,其他人将在某个迭代深度后停止。IE - 我们使用 IE 版本 10 对此进行了测试 - 只是崩溃了 :)
这个.php
<html>
<head></head>
<body>
<iframe src="this.php?q=<?php echo (isset($_GET['q'])?$_GET['q']:1)+1?>" />
</body>
</html>
IE 6.0 可以在没有脚本的情况下崩溃:
<iframe src="this.html?c=9"></iframe>
我不确定为什么这不会触发循环检测,也不确定它是否已更改。