在某个时候,我曾听说使用iframe是“不良惯例”。
这是真的吗?使用它们的利弊如何?
就像所有技术一样,iframe也有它的优点和缺点。如果你使用iframe来规避一个已经完全开发好的网站,那当然是不好的做法。但有时候使用iframe是可以接受的。
使用iframe的主要问题之一与书签和导航有关。如果你仅仅是使用它将页面嵌入你的内容中,那我认为这是可以的。那就是iframe的用途。
然而,我也看过滥用iframe的情况。它永远不应该被用作站点的一个组成部分,而应该作为站点内的一个内容片段。
通常,如果你可以不使用iframe完成这个功能,那会是更好的选择。我相信其他人在这里可能会有更多信息或更具体的例子,但这归结于你所要解决的问题。
话虽如此,如果你只能使用HTML并且没有访问像PHP或ASP.NET等后端,则有时候iframe是你唯一的选择。
window.postMessage()
进行通信,例如实现协作iframe自动调整大小。 - Tobia它们并不是不好的实践,它们只是另一种工具,并且增加了灵活性。
作为标准页面元素使用时,它们很好,因为它们是将内容分隔到多个页面上的简单可靠的方式。特别是对于用户生成的内容,将内部页面 "沙盒化 "到 iframe 中可能会很有用,这样糟糕的标记就不会影响主页面。缺点是如果引入多层滚动(浏览器和 iframe 的滚动),你的用户会感到沮丧。像 adzm 说的那样,你不想将 iframe 用于主导航,但要将它们视为文本/标记等效于视频或其他媒体文件的嵌入方式。
对于脚本后台事件,选择通常在隐藏的 iframe 和 XmlHttpRequest 之间进行,以加载当前页面的内容。区别在于,iframe 生成一个页面加载,因此你可以在大多数浏览器中通过浏览器缓存回退和前进。请注意,Google 在许多地方使用 XmlHttpRequest,但在某些情况下也使用 iframe 允许用户在浏览器历史记录中后退和前进。
如果不了解它们的缺点,使用它们是“不良实践”。Adzm的帖子很好地总结了它们。
另一方面,Gmail在后台为其某些更酷的功能(如自动文件上传)大量使用iFrame。如果您了解iFrame的限制,我认为您不应该有任何犹豫使用它们。
在许多情况下与它们一起工作后,我真的认为 iframe是Web编程中的goto语句等价物。也就是说,应该尽量避免使用。在一个网站内部,它们可能有些用处。但是,在跨站点时,除了最简单的内容之外,它们几乎总是一个坏主意。
考虑以下可能性...如果用于参数化内容,则它们创建了一个接口。在专业站点中,该接口需要服务级别协议和版本管理-通常会忽略这些问题而匆忙上线。
如果用于托管脚本的框架,那么就有不同的跨域脚本限制。有些可以被黑客攻击,但很少能保持一致性。如果您的框架内容需要交互,则它将难以超越框架进行交互。
如果与许可内容一起使用,那么参与的站点将负担从主机之间移动授权信息的需求。
因此,尽管它们偶尔在网站内部有用,但它们相当不适合混搭。你最好看看真正的门户和端口,更糟糕的是,他们是每个网络新手都喜欢的东西 - 许多技术经理已经将它们视为解决许多问题的方法。实际上,它们会制造更多问题。
根据我的经验,使用iframe的一个优点是在调用第三方代码时,可能涉及到调用一个调用Document.write();
命令的javascript,正如您所知,由于它是解析的方式(DOM解析器等),这些命令无法异步调用。其中一个示例是http://sourceforge.net/projects/phpadsnew/ 我使用iframe来加速我们的网站,因为有多个对phpadsnews的调用,该网站正在等待响应,然后才能呈现页面的其他部分。使用iframe,我能够让网站呈现页面的其他部分,并仍可以异步调用phpads的Document.write()
命令,从而防止js锁定。
iframes确实有用途。否则,您怎么能将天气预报网络小部件放在您的页面上呢?唯一的其他方法是获取他们的XML并解析它,但是当然您需要条件来展示相关的天气图形... 如果您有时间,这不值得,但是更加清晰。
当您的主页面以HTTP协议加载,而页面的某些部分需要在HTTPS协议下工作时,iFrame可以轻松胜过jsonp。
特别是,如果您的dataType不是本地的json格式,并且需要在服务器上将其翻译成json格式,然后在客户端再将其翻译回例如复杂的html格式。
所以不,iFrame并不是邪恶的。
它们并不糟糕,实际上很有帮助。有一段时间我遇到了一个巨大的问题,需要嵌入我的Twitter动态,但是它就是不能与同一页md格式兼容,所以我将它放在了另外一个页面,并以iframe形式插入。
此外,它们非常好,因为所有浏览器(包括手机浏览器)都支持它们。只要使用得当,它们就不会被视为一种不良做法。