IFrames(HTML)已经过时了吗?

98

收到了关于此事的矛盾信息,希望这些信息不是真的。

对此还有一些额外的问题:

  1. 他们为什么要逐步淘汰这个标签?
  2. 有没有替代方案?

它们并不过时:https://softwareengineering.stackexchange.com/questions/144515/why-were-frames-removed-in-html5-but-not-iframes。替代方案https://dev59.com/9Woy5IYBdhLWcg3wN7UX - Michael Freidgeim
这个有更新了吗?这个问题在2009年被提出和回答,现在已经是2020年了。 - Kellen Stuart
13个回答

79

HTML5仍然支持<iframe>,因此我认为这在不久的将来不会改变。

回答您的其他问题:

  1. <iframe>(以及框架一般)大多数情况下不够用户友好:
    • 它们不允许通过URL轻松访问框架中的内容(至少不会丢失框架外的内容)。
    • 大多数“技术恐惧症”用户被框架所困扰。
    • 据我所知,对于浏览器而言,它们渲染速度较慢。
  2. 替代方案包括动态页面生成(SSI、PHP、Rails等),以及使用JavaScript / AJAX更改例如<div>的内容。

要明确:我谈论的是<iframe>作为界面元素。不是用于加载其他内容的隐藏元素,例如Google Mail。


31
谷歌使用iframes进行高度专门化的目的是一个值得肯定的观点。 - cgp

56

在我看来,W3C在从Strict HTML和XHTML doctype中删除iframes方面过早行动了。理论上,您可以使用元素将外部对象添加到您的文档中,但是浏览器的差异和限制使得许多开发人员无法启动此功能。随着更加务实的HTML 5(仍处于草案阶段),iframes又回来了,甚至还有两个新属性:seamless和引人注目的sandbox。


太棒了,我只希望浏览器开始支持AJAX文件上传,这样我们就不需要使用iframe或flash了。 - Xeoncross
@Xeoncross Firefox和Chrome都可以使用:https://developer.mozilla.org/zh-CN/docs/Using_files_from_web_applications - jches
2
更新:html5中的seamless属性已被删除。请参见:https://caniuse.com/#feat=iframe-seamless - Gabe

26

IFrames不过时,但使用它们的原因很少。

使用IFrames的原因:

  • 将其他网站的东西与其他域隔离开是非常好的,但它不能平稳地集成。(样式表、JavaScript等)
  • 通过IFrame集成多媒体有时比使用嵌入标签更容易。
  • 极其专业特殊的情况,例如gmail的情况,他们正在使用它来管理声音和历史记录。

我还要说的是,没有必要删除iframes,它是一个必需的标记,并且将持续存在一段时间。


25

Iframes(内嵌框架)已经过时,不应该用于页面布局。即使基于表格的布局也比使用iframes更好,应该使用良好的CSS布局。

使用iframes的好处有:

  • 广告:例如Google AdWords就使用了这种技术,它非常适合封装 - 广告的CSS样式不会破坏您的页面。
  • 隐藏iframe:它可以用于很多实用的功能,如跟踪、Ajax替代等。

35
请勿使用iframes投放广告,这是违反服务条款的行为。原文链接:http://www.scribd.com/doc/97655/15-Common-Mistakes-by-Google-Adsense-Publishers-that-Violate-Terms-of-Service - cgp
38
altCognito: AdWords使用的是iframe,不是我:)我并不是指把AdWords的iframe放到另一个iframe中。 - Thinker
7
我知道这是一个普遍的错误(所以有那么多文章),因此我想提醒一下,以确保人们理解你的意思。 - cgp
5
在包含必须来自另一个域且不能通过当前页面的CSS或JS代码进行操作的复杂内容时,Iframes是必需的。请注意保持翻译后的内容与原文意思一致,不要添加额外解释或其他内容。 - vsync
5
你所谈论的与iframe无关。重点是-使用iframe来引入嵌套的外部浏览上下文,而不是用于“页面布局”。如果我需要一个嵌套的浏览上下文-我怎么可能使用“良好的CSS布局”呢?这没有意义。 - Chris B
显示剩余4条评论

12

我看到过很多论坛建议使用Object标签替换IFrame,这在大多数情况下可能都有效。

例如,我有一个PDF文档显示在IFrame中(因为除了PDF之外还有其他需要在页面上展示的内容),并且成功地使用Object标签将其显示出来。

原本是:

<iframe id="confirmed_pdf" class="current_pdf" src="/prescriptions/show_pdf?id=123" height="570" width="480"></iframe>

变成了:

<object id="confirmed_pdf" class="current_pdf" data="/prescriptions/show_pdf?id=123" type="application/pdf" height="570" width="480">
  <p>[Show this message if displaying the PDF did not work]</p>
</object>

但是Object不适合用作替代品来满足只能打印PDF部分的要求。

IFrame就像页面内的一个独立窗口(基本上是一个窗口里面的另一个窗口),一旦获取了窗口对象,你可以调用它的.print()方法进行打印,例如:

jQuery("#confirmed_pdf").contentWindow.print();
< p >IFrame有一个contentWindow属性,这就是使只打印该部分成为可能的原因。 Object没有contentWindow属性,因此无法仅打印页面的<object>部分。< /p>

因此,如果您只是使用IFrame来显示某些内容,那么可以使用其他标签,如Object。但是,如果您需要以某种方式与IFrame的内容进行交互,则可能需要使用IFrame。


7

IFrames经常与AJAX一起使用。例如,GMail使用了我相信有九个隐藏的IFrames。


5
我发现有五个 iframe。其中一个没有隐藏,事实上,其中一个几乎占据了整个视图。通常不会在 Ajax 中使用 iframe(至少在主要框架中没有这样做)。 Gmail 使用 iframe 来进行以下操作:历史记录跟踪、声音(奇怪的)、某种画布绘制。 - cgp
我只是根据我几年前读过的一篇文章。 - John Topley

7

IFrames并没有过时,但是Frameset/Frames正在逐渐淘汰。

在最近两个版本的IE(IE7/IE8)中,放大Frames(而不是IFrames)会导致灾难性的结果。

可以使用IFrames,但我个人认为应该避免使用Framesets/Frames。


5
马适其则骑,

5

在我的上家公司,我们提供了一个托管应用程序,客户可以将其集成到自己的网站中。有时,他们会使用IFrame来实现这一点,将我们的托管页面适应其现有设计。有时甚至可以无缝地完成(即IFrame没有边框或滚动条,它看起来就像页面的一部分)。我认为这是标签的良好使用。


使用iframe的优势在于,你可以将需要嵌入客户网站的内容以自己的风格和JavaScript方式呈现,同时避免用户代码的干扰。CSS容易被覆盖,而JavaScript有时会导致冲突(在极少数情况下),因此采用"封闭系统"方法是最好的选择。 - vsync

5
它们在某些情况下非常有用,但这种情况很有限,特别是在多个网站上嵌入共同功能的情况下。例如,我有一个客户经营着许多苏格兰商品电子商务网站。作为其中之一,我们开发了几个简单的应用程序,以从您的姓氏或所选的拜伦图案中查找可能的氏族名称(如果你愿意的话可以笑一下,但苏格兰拜伦图案对我们的经济价值高达7亿美元)。其背后的数据库相当大(核心名称和拜伦图案表中有将近一万行),并且经常进行更新。因此,我们已经设置了应用程序在一个网站上运行,并使用 iframe 将其嵌入到其他网站中,实现了简单的 javascript 参数传递,以便我们可以将选定的拜伦图案或氏族与嵌入站点的功能集成。该 iframe 设置为无边框,因此对最终用户来说完全无缝。当然,还有其他方法可以做到这一点,但使用 iframe 是简单而强大的方法。它肯定不过时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接