传统的iframe,什么是完全成熟的替代品?

时间:2009-12-16 00:35:07

标签: jquery iframe accessibility

严重使用主iframe的网站

我继承了遗留代码库/网站http://ninjawars.net。在我开始在网站上编码之前,iframe已经到位。

我经常听到iframe的问题(安全性,可访问性,布局问题),而且我很确定iframe对搜索引擎不友好(很大的减号)。我个人使用iframe的经历主要是他们的加载时间出现了问题(我猜是很多http请求?)。

正在搜索iframe

的替代品

不幸的是,没有人说“摆脱iframe”也能为我的情况提供有效的解决方案,通常假设框架内容的简单包含会使所有的彩虹和独角兽(例如Converting from iframes )。就我而言,静态包含解决方案对我来说几乎没有。

jQuery load()(例如,将内容动态加载到div中)更合适,但转换到该方法需要花费时间,并且不利于搜索引擎的可访问性或非javascript浏览用户。 jQuery load()修复了速度问题,但我不确定它是否修复了可访问性问题。即使没有javascript,iframe仍可正常工作(手动点击),但是保持iframe在javascript下工作的额外支持是否切实可行,我不确定。

潜在替代方案?

  • jQuery& load()
  • 使用常见的页眉/页脚/侧边栏+一些小的javascript轮询,将网站完全重写为静态页面。
  • ???我尚未考虑的事情???

3 个答案:

答案 0 :(得分:4)

iframe不是某些无名恶魔的产物,因为有些人会让你相信。它们仍然是Web应用程序非常有用的地方。

然而,他们肯定 对搜索引擎优化不利!除非绝对必要,否则我绝不会建议“正常”的公共网站使用它们,特别是如果SEO是一个大问题。

我认为jQuery是解决可访问性问题的好选择。关于jQuery的一个好处是,很容易让那些没有javascript的用户(如搜索引擎)优雅地降低你的网站。

基本上我使用jQuery处理新的公共网站的方式如下:

  1. 使用静态导航构建网站。我通常会从某个ajax请求中获取的所有内容块(在您的情况下,在iframe中),我可以在自己的页面中访问。 “联系我们”表单是一个很好的例子 - 将它放在非javascript用户自己的页面中,但它最终会将ajax加载到普通用户的模态div中。静态导航可确保搜索引擎查看所有内容。在您的情况下,将iframe替换为仅包含指向iframe当前正在加载的网页的链接的div。

  2. 添加jQuery。一次取一页,开始用ajax调用替换所有出现的静态导航链接,以加载你想要的内容。

  3. 不断重构javascript,直到您将其缩小为可在网站上的所有导航中运行的脚本。

  4. 以下是一个简单优雅可降级网站的示例(取自我工作过的网站):

    $(document).ready(function() {
    
        $("#menu a[href]").each(function() {
            this.href = this.href.replace(/Index/, "Ajax");
        })
        .click(function() {
            $.get(this.href, null, function(data) {
                var $main = $("#main");
                $main.hide();
                $("#main").html(data);
                $main.fadeIn("slow");
            });
            return false;
        });
    

    此脚本在网站的所有页面中运行,用“/ Ajax /”替换菜单导航目标URL中出现的任何“/ Index /”,将URL重定向到返回ajax响应的资源,然后添加单击处理程序,处理将内容添加到页面。

    现在,搜索引擎和非JS用户可以按照静态导航进行操作,并且JS用户可以获得更快捷的UI效果。

答案 1 :(得分:1)

您是否考虑过将jQuery的Ajax功能与history plugin结合使用?这样,您可以保留浏览器的后退按钮功能,并确保支持书签,而无需在网站上导航时重新加载整个静态页面。我不知道它是否对搜索引擎友好(我喜欢让自己相信它是。)

答案 2 :(得分:1)

我假设您希望保持界面基本相同 - 左侧,右侧和顶部始终保持在同一位置,中心部分可以根据需要向下滚动。如果这是真的,我会尝试以下布局:

  1. 设计页面,将左侧,右侧和顶部放置在各自的div中,将中间部分放在scrolling div中,方法是使用“overflow:auto”。
  2. 将left,right和top div分成他们自己的PHP文件,并将它们包含在每个页面中。因此,每个页面都包含这些文件,然后在可滚动的div中定义唯一内容。
  3. 不可否认,这不是最优雅的解决方案(我更喜欢使用像Apache Tiles in Java这样的库)。但它过去对我来说效果很好。使此可维护性的关键是使每个包含文件以该部分的<div>标记开头,并以该部分的</div>标记结束。编写包含在不同级别上开始和结束的文件,或者打开必须在另一个文件中关闭的div,这是令人头疼的原因。