人们为什么仍然使用iframe?[关闭]


89

对我来说,iframe是纯粹的邪恶(嗯,也许不是那么纯粹)。他们似乎制造了很多麻烦。是的,您的整个网站将加载一次,然后您只能加载一个页面。但是人们为此目的发明了AJAX。

我发现的最大问题之一iframe是,我无法粘贴到其中一个子页面的链接,因为URL从未改变(是的,我知道这是一种解决方法)。其次,网络搜索引擎可能无法正确索引该站点。

有时,此站点的可访问性较差,某些浏览器甚至可能无法正确显示它们。

有没有(i)框架设计布局的更好方法。每天我都能看到有人问SO问题,例如“如何使用jQuery访问iframe?”。

那么iframe的好处是什么?仍然使用它们是什么原因?我只是想知道为什么:)

(因为这不是一个真正的问题,所以是CW)


我同意上面的摩西。Iframe的唯一其他用途是:不支持现代CSS或在某些专有环境中的古老Web客户端。
鲍里斯·哈曼诺夫

不幸的是,这些天,每个浏览器都存在兼容性问题!他们不是标准的!div标签有问题,表标签有问题等等。。。他们会浪费我们的时间来设计100%兼容的网站。有时甚至是使网站与IE7兼容的最终方法。正在使用iframe。iframe可以修补每个问题:'((如果您检查我的网站状态,您会看到IE7的大量访问。即使在2016年,很多人
仍在

Answers:


102

我现在可以想到两个为什么人们仍然使用iframe而不是AJAX的原因:

1)iframe规避了跨域来源政策(图片,脚本和样式则没有)。这对于相对安全地从其他域名提取站点/内容很有用。基本上,这具有以下优点:可以直观地显示来自其他域的数据,而不会让它们无限制地访问整个页面(例如JSONP之类的东西)。

2)您可以从iframe中加载多种类型的资源,而不仅仅是某些mime类型(相对而言,您只能使用application / javascript,application / x-javascript,text / css,text / xml,image / png,image / jpeg,包含脚本的图像/ gif,XHR,图像和源)。例如,如果要向您显示PDF,则可以打开一个iframe,然后让Adobe Reader插件向您显示该文件。此外,在同一个域中,如果我想将脚本,样式和图像全部一起管道化(在页面上内联,图像必须是数据URI),则可以使用iframe来完成此操作(如果它位于同一位置)域,端口和协议,我也可以使用JavaScript访问它)。

您是否知道Gmail是一组iframe?可见的部分只是巧妙的定位。此外,许多OAuth实现(Twitter,Facebook,Google,Yahoo!)通常使用iframe将其域上的用户与成功的身份验证URL关联(在用户登录后)。


2
关于#1,但是HTTP标头可以阻止iframe .....
Pacerier's

2
关于#2,但是您可以在没有iframe的情况下做到这一点,例如<embed src="http://www.pdf995.com/samples/pdf.pdf" type="application/pdf">
Pacerier's

4
关于#3,可以在不使用iframe的情况下重写Gmail。那么,为什么人们仍将iframe用于现代浏览器?这个问题没有得到回答。
Pacerier's

22

IFRAME用于将第三方内容嵌入和隔离到网站中。

大多数网络广告解决方案都基于iframe,因为它们提供了安全性(跨域策略)和屏幕上孤立的矩形,可以由第三方内容和脚本进行全面管理(常见的用例是广告)。

IFRAMES的另一种现代用法是管理AJAX应用程序的历史记录(常见的后退按钮解决方法)。

FRAME是IFRAMES的较差版本。它们的使用正在减少。


1
这要简单得多,并且是广告的好例子:)
oneworld 2013年

15

如果用户禁用了JavaScript,则iframe将在ajax不能运行时起作用。考虑到人们使用NoScript之类的东西,这并不是不可能的。


4
的确如此,但是在大多数情况下,更改/添加/操纵iframe都需要JavaScript(我可以想到的2种情况除外,即链接到目标并<form>发布到目标)。
丹·束

对; 即使如此,更改iframe指向使用JS的内容通常只需要一行,而不是的更大复杂性XMLHttpRequest
Reinderien's

7

当我需要在不重新加载页面的情况下上传文件时,我在ajax网站上使用它们。


@Mwizak Ajax应该afaik覆盖包括Angular在内的各种JavaScript。
CodeReaper

3

我仍然看到iframe在大型公司中使用,它们提供一个单一的标志,在该标志上注入有关经过身份验证的用户的标头信息,然后该标头信息通过iframe传递给实际的应用程序。由于围绕iframe的“门户”可以处理所有特定的身份验证详细信息,因此其背后的那些应用程序不需要为其提供每个实现,从而使开发团队更轻松地进行开发,并且可以在一个位置监视和调整身份验证详细信息的用户。


除非域,协议和端口不匹配(这意味着您遇到了与其他问题不同),否则请不要理解为什么无法使用XMLHttpRequest添加标头(w3.org/TR/XMLHttpRequest/#the-setrequestheader-method)标头)?
丹·束

关键是它是2种不同的应用程序,通常甚至是2种完全不同的技术。一个负责身份验证,另一个负责获取身份验证票证的注入头(或在需要时构建)。
克里斯·范德·玛斯特

3

有很多技术上的原因来使用它们(尤其是Dan Beam提到的安全性问题)。

您不应该使用“像框架”这样的iframe,仅通过更新iframe来导航到新页面。如您所说,这将阻止导航添加书签/链接,响应常规导航按钮以及提供有用的链接功能,例如“打开新标签”。

但这并不是iframe所特有的。通过使用获取新内容XMLHttpRequest并将其写入主内容div的内容,您可以看到越来越多的导航页面innerHTML。通常,这是通过jQueryload()和巧妙的滑动动画来完成的。这破坏了导航与iframe所使用的框架一样严重,甚至破坏了老式框架集。如此多的Web作者使用这种策略感到遗憾,因为它实际上是昨天鄙视的框架集的一个新外观,而这是一种超现代的Web设计方法。

您可以在两种情况下都解决此问题,但这意味着您必须在#片段标识符部分中存储一个viewstate并支持适当的哈希导航,这并非易事。即使那样,您仍然会遇到非JS代理(例如搜索引擎)的问题;您最终必须具有?基于并行#的导航和基于并行的导航,才能同时支持这两种导航。这很痛苦,大多数人都不会打扰。


期待HTML5中的History API,它将允许在不重新加载或断开后退/前进按钮的情况下获取内容。
Lie Ryan

2

从HTML 5开始,框架集已经过时,有时您需要在一个站点内与另一个站点建立框架。而且AJAX只能做很多事情。尝试通过不带iframe的https将文件上传到其他域上的网站。AJAX不会帮助您。


2

除了其他原因外,我iframe在应用程序中还有一种特定的用法。不幸的是,我的目标浏览器是Internet Explorer 6。我需要在网页中固定页脚和页眉。该页面的主要部分是可滚动的。

但是,IE6中存在一个错误,即无法使用CSS属性divselect元素顶部显示元素z-index。因此,我需要创建一个iframe将用作hack来避免此问题。

当然,这是一个真正特定的用法,iframe只需要关注IE6...



1

我当时正在建立一个社交网络,我发现iframe对于将小部件放在其他人的网站上以使其像微型个人资料一样显示或与远程服务器上的内容集成在一起非常有用。似乎是最简单的构建方法。我知道一些小部件使用JavaScript。同样,使用iframe方法,会话就像正常访问网站一样,对于像按钮一样有用。



0

在某些情况下,例如X域请求或通过参数将数据发布到源中,iFrame都可以。但是,当我想跨域访问数据时,我更喜欢使用CSS文件-它们可以接受参数,设置cookie,将内容添加到页面(:before和:after)并提供视觉反馈。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.