来源:http : //www.rwblackburn.com/2012/07/iframe-evil/
所以似乎我从事的每一项工作,都会出现同样的话题。在某些时候,有人会说,“只需为此使用 iFrame”。然后我需要沿着旧的疲惫的道路走下去,为什么这不是一个好主意。
好吧,这篇文章对我来说有点实用。我希望将 iFrame 不是万能解决方案的所有原因都放在一个地方,这样我就可以在将来节省一些时间,并将人们指向这个 URL。因此,我可能会在完善这些要点时不时更新这篇文章。如果您愿意,请随意将这篇文章用于相同的目的,并将我遗漏的任何建议或要点张贴到我的twitter帐户 (@rwbDev),如果我将要点添加到本文中,我一定会感谢您。
现在,让我说清楚。iFrame 确实有一个有效的目的。我自己实际上已经多次使用 iFrame,并取得了巨大的成功。问题是人们倾向于使用它们来绕过糟糕的架构,或者只是解决问题。根据我的经验,这通常只是将一个小问题换成更大的问题,而且通常是不必要的权衡。我将在下面介绍这两点。
对 SEO 不利。这是您会发现避免使用 iFrame 的最普遍原因之一。某些搜索引擎可能难以处理 iFrame 中引用的页面。这对网站或页面的搜索排名有多大影响尚不完全清楚。然而,与我交谈过的大多数专家都同意它肯定会产生一些影响。看看这个关于热带的有趣表格帖子。有关 SEO 如何工作的详细信息,以及像这样的设计决策的影响,我建议查看 seomoz.org。如果您的页面或应用程序不关心 SEO,这当然不是问题。例如,需要登录的应用程序(无论如何,搜索引擎都无法访问登录后的所有页面)。* 注意(2013 年 6 月 6 日添加):最近的测试表明,搜索引擎实际上可能会跟踪 iFrame 中的链接。这意味着 iFrame 的 SEO 影响比过去小得多。目前还不清楚是否有影响,不同的搜索引擎在这方面可能表现不同。
链接/书签。除非您引入额外的 JavaScript,否则用户将无法直接获得 iFrame 中内容的链接。这包括某人可能通过电子邮件发送给朋友的链接、书签或出现在搜索引擎结果中的页面。想象一下您的用户访问您的页面,并且一些内容在 iFrame 中。他们单击 iFramed 内容中的链接。此内容将按预期保留在 iFrame 中。现在,您的用户在 iFrame 中找到了他们导航到的一些内容,并希望将其发送给朋友。但是在他们的浏览器中复制 URL 是行不通的,这只会将朋友发送到初始页面,原始内容显示在 iFrame 中。有一些脚本可以解决这个问题。我自己已经实现了几次(在我别无选择的情况下)。然而,这些通常会引入一些他们自己的问题,并且经常有跨浏览器的兼容性问题。通常它也是正确的越野车。同样,根据您的站点或应用程序的需求,这可能不是问题,但对于大多数站点来说这是一个大问题。
调试困难。这是人们经常忽略的一项。如果您有一个健壮的应用程序,其中包含复杂的 jQuery、Ajax 和整个页面中发生的其他很酷的东西——iFrames 会使调试问题变得更加困难。错误是发生在外页还是框架内的页面?浏览器开发人员工具可以帮助解决这个问题,但即使是这些工具,在您处理 iFrame 时也不一定能清楚地说明问题出在哪里。当页面位于 iFrame 内时,错误会被复制的频率如此之高,但在 iFrame 外加载时却能正常工作,您会感到惊讶。这是任何网站的问题。但特别是对于广泛使用 iFrame 的网站。系统中的活动部件越多,诊断问题就越困难。
没有真正的性能提升。偶尔我会找到想要使用 iFrame 的人,因为他们觉得这会提高他们网站的性能。他们通常会有这种感觉,因为这样可以避免在站点分页时重新加载站点的页眉/页脚/菜单。通常情况下,情况正好相反。事实上,根据我的经验,与修复应用程序的架构相比,它从未带来性能提升。首先,考虑浏览器将缓存图像、CSS 和 JS 文件。因此,无论如何这些都不会随每个页面重新加载。但更重要的是,按照这些思路思考的人经常将 iFrame 视为穷人的 AJAX。然而,iFrame 分页的内容几乎总是比真正的 AJAX 调用重,后者使用 XML 或 JSON 加载和刷新页面内容的一小部分。
只是很难保持稳定。我以前工作的一个大型站点广泛使用了 iFrame。我不确定 NDA 在这里适用于何处,因此为了安全起见,我不会链接到他们的网站。他们经常使用它们,并且拥有用于(理论上)避免使用 iFrame 的正常缺点的所有脚本和花哨的技巧。然而,由于 iFrame 的广泛滥用和过度使用,他们的网站上仍然经常出现问题和错误。在论坛、LinkedIn、Twitter 等上,也经常有客户抱怨这给他们带来的问题。刚才我跳转到他们的网站,几分钟后发现一个页面因为 iFrame 问题而给我一个错误。这些聪明人非常了解 iFrame 的问题。然而,即使他们在多年后仍继续与它搏斗。当 iFrame 像在本网站上一样被滥用时,