为什么人们仍然使用iFrame?

为什么人们仍然使用iFrame?,iframe,Iframe,对我来说,Iframe是纯粹的邪恶(好吧,也许不是那么纯粹)。他们似乎制造了很多麻烦。是的,你的整个网站将加载一次,然后你可以只加载一个页面。但是人们发明AJAX就是为了这个目的 使用iframe发现的最大问题之一是,我无法将链接粘贴到其中一个子页面,因为URL从未更改(是的,我知道有一种解决方法)。第二件事,网络搜索引擎在正确索引这些站点时可能会遇到问题 有时,此网站的可访问性更差,一些浏览器甚至可以不正确地显示它们 有更好的方法来设计没有(i)框架的布局。每天我都能看到有人问一些问题,比如“

对我来说,Iframe是纯粹的邪恶(好吧,也许不是那么纯粹)。他们似乎制造了很多麻烦。是的,你的整个网站将加载一次,然后你可以只加载一个页面。但是人们发明AJAX就是为了这个目的

使用
iframe
发现的最大问题之一是,我无法将链接粘贴到其中一个子页面,因为URL从未更改(是的,我知道有一种解决方法)。第二件事,网络搜索引擎在正确索引这些站点时可能会遇到问题

有时,此网站的可访问性更差,一些浏览器甚至可以不正确地显示它们

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

那么iFrame的好处是什么呢?还有什么理由继续使用它们?我只是想知道为什么:)


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

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

从HTML5开始,框架集就过时了,有时您需要在一个站点中有一个包含另一个站点的框架。
AJAX也只能做这么多。尝试在没有iframe的情况下通过https将文件上载到另一个域上的站点。AJAX在这方面帮不了你。

我仍然看到iframe在大公司中使用,它们提供一个单一的登录,注入关于经过身份验证的用户的头信息,然后通过iframe传递给实际的应用程序。由于iframe周围的“门户”处理所有特定的身份验证详细信息,因此其背后的应用程序不需要每个应用程序都有一个实现,从而使开发团队更容易实现,并且有一个单独的位置来监视和调整用户的身份验证详细信息。

如果用户禁用了javascript,当ajax不起作用时,iFrame将起作用。考虑到人们使用的是。

Javascript所见即所得编辑器使用iframe,这不是不可能的,因为这是最简单、最好的方法。例如,TinyMCE使用它:


许多格式化文本编辑器(例如TinyMCE、HTMLArea)都是作为iframe实现的

我能想到(目前)人们仍然使用iFrame而不是AJAX的两个原因:

1) iFrame绕过了跨域源策略(图像、脚本和样式不受限制)。这对于相对安全地从其他域名引入站点/内容非常有用。基本上,这样做的好处是能够直观地显示来自其他域的数据,而不让它们以无限的访问权限在页面上到处跺脚(就像JSONP能够做到的那样)

2) 您可以从iframe中加载多种类型的资源,而不仅仅是某些mime类型(您相对限于application/javascript、application/x-javascript、text/css、text/xml、image/png、image/jpeg、image/gif以及脚本、XHR、图像和源)。例如,如果我想给你看一个PDF,我可以打开一个iframe,让Adobe Reader插件给你看这个文件。此外,在同一个域中,如果我想将脚本、样式和图像一起管道化(在页面上内联,图像必须是数据URI),我可以使用iframe来完成这一点(如果它在同一个域、端口和协议中,我也可以使用JavaScript访问它)


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

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

使用它们有很多技术原因(特别是丹·比姆提到的安全问题)

您不应该使用iframes“像frames一样”,只通过更新iframe来导航到新页面。正如您所说,这会阻止导航成为可书签/可链接的,响应正常的导航按钮,并提供有用的链接功能,如“在新选项卡中打开”

但这并不是iframes所特有的。通过使用
XMLHttpRequest
获取新内容并将其写入主content div的
innerHTML
,您可以看到越来越多的页面进行导航。这通常是通过jQuery
load()
和巧妙的幻灯片动画来完成的。这破坏了导航,就像iframe用作frame一样严重,或者实际上是老式的框架集。令人遗憾的是,许多网络作者都在使用这种策略,认为它是一种超现代的网页设计方法,而实际上它只是昨天被轻视的框架集上的一层新皮


在这两种情况下都可以解决这个问题,但这意味着您必须在
#
片段标识符部分中存储一个viewstate,并支持正确的散列导航,这并不简单。即使这样,你仍然会遇到搜索引擎等非JS代理的问题;最后,您必须有一个并行的基于
和基于
#
的导航来支持这两种功能。这是一件痛苦的事情,大多数人都不介意。

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

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

iFrame的另一个现代用途是管理AJAX应用程序的历史记录(通用后退按钮解决方法)


框架是iFrame的拙劣版本。它们的使用正在减少。

除了其他原因外,我在