来源: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 内时,您会惊讶地发现 bug 被复制的频率,但在 iFrame 外部加载时工作正常。这是任何网站的问题。但特别是对于广泛使用 iFrame 的网站。系统中的活动部件越多,诊断问题就越困难。
没有真正的性能提升。有时我会发现有人想要使用 iFrame,因为他们觉得这会提高他们网站的性能。他们通常有这种感觉,因为它可以避免在网站分页时重新加载网站的页眉/页脚/菜单。通常情况正好相反。事实上,根据我的经验,与修复应用程序架构相比,它从未带来性能提升。首先,考虑浏览器会缓存图像、CSS 和 JS 文件。所以这些无论如何都不会重新加载每个页面。但更重要的是,沿着这些思路思考的人经常将 iFrame 视为穷人的 AJAX。但是,iFrame 分页的内容几乎总是比真正的 AJAX 调用重,后者使用 XML 或 JSON 加载和刷新页面内容的一小部分。
它很难保持稳定。我以前工作的一个大型网站广泛使用了 iFrame。我不确定 NDA 在哪里适用,所以为了安全起见,我不会链接到他们的网站。他们经常使用它们,并且拥有所有用于(理论上)避免使用 iFrame 的正常缺点的脚本和花哨的技巧。然而,由于 iFrame 的广泛滥用和过度使用,他们的网站上仍然经常出现问题和错误。论坛、LinkedIn、Twitter 等上也经常有客户抱怨这给他们带来的问题。刚才我跳到他们的网站,几分钟后发现一个页面因为 iFrame 问题而给我一个错误。这些是非常了解 iFrame 问题的聪明人。然而,即使是他们也在继续与它搏斗,多年后。当 iFrame 像在本网站上一样被滥用时,再多花哨的脚本也无法完全解决不可避免地出现的问题。