Quirksmode 有一个post on this。
由于该页面现已损坏,只能通过archive.org 访问,因此我在此处复制了它:
IFrame
在此页面上,我简要概述了从它们所在的页面访问 iframe。毫不奇怪,有一些浏览器注意事项。
iframe 是一个内联框架,它包含一个具有自己的 URL 的完全独立的页面,但仍放置在另一个 HTML 页面中。这为网页设计提供了非常好的可能性。问题是访问 iframe,例如将新页面加载到其中。本页介绍了如何操作。
框架还是对象?
基本问题是 iframe 是被视为框架还是对象。
- 正如Introduction to frames 页面所解释的,如果您使用框架,浏览器会为您创建框架层次结构(
top.frames[1].frames[2] 等)。 iframe 是否适合此框架层次结构?
- 或者浏览器是否将 iframe 视为另一个对象,一个恰好具有 src 属性的对象?在这种情况下,我们必须使用标准的DOM call(如
document.getElementById('theiframe')) 来访问它。
通常,浏览器允许在“真实”(硬编码)iframe 上进行两种视图,但生成的 iframe 不能作为框架访问。
名称属性
最重要的规则是为您创建的任何 iframe 提供name 属性,即使您还使用了id。
<iframe src="iframe_page1.html"
id="testiframe"
name="testiframe"></iframe>
大多数浏览器需要name 属性来使 iframe 成为框架层次结构的一部分。某些浏览器(尤其是 Mozilla)需要 id 才能使 iframe 作为对象访问。通过将这两个属性分配给 iframe,您可以保持选项打开。但name 远比id 重要。
访问
要么将 iframe 作为对象访问并更改其 src,要么将 iframe 作为框架访问并更改其 location.href。
document.getElementById('iframe_id').src = 'newpage.html';
框架['iframe_name'].location.href = 'newpage.html';
框架语法稍微好一点,因为 Opera 6 支持它,但不支持对象语法。
访问 iframe
因此,为了获得完整的跨浏览器体验,您应该为 iframe 命名并使用
frames['testiframe'].location.href
语法。据我所知,这总是有效的。
访问文档
只要您使用name 属性,访问 iframe 内的文档非常简单。要计算 iframe 中文档中的链接数,请执行
frames['testiframe'].document.links.length.
生成的 iframe
但是,当您通过W3C DOM 生成 iframe 时,iframe 不会立即输入到frames 数组中,并且frames['testiframe'].location.href 语法不会立即起作用。在 iframe 出现在数组中之前,浏览器需要一点时间,这段时间没有脚本可以运行。
document.getElementById('testiframe').src 语法适用于所有情况。
链接的target 属性也不适用于生成的 iframe,但在 Opera 中除外,即使我为生成的 iframe 同时提供了name 和id。
缺少target 支持意味着您必须使用 JavaScript 来更改生成的 iframe 的内容,但是由于您首先需要 JavaScript 来生成它,所以我认为这不是什么大问题.
iframe 中的文本大小
一个奇怪的 Explorer 6 独有的错误:
当您通过“查看”菜单更改文本大小时,iframe 中的文本大小会正确更改。但是,该浏览器不会更改原始文本中的换行符,因此部分文本可能会变得不可见,或者可能会出现换行符,而该行仍然可以容纳另一个单词。