更好的替代 iframe 来显示标签内容?

Posted

技术标签:

【中文标题】更好的替代 iframe 来显示标签内容?【英文标题】:Better alternative to an iframe to display tab content? 【发布时间】:2011-01-07 08:31:26 【问题描述】:

我有一个带有 iframe 的页面,用于显示点击标签的内容。有 3 个选项卡和 1 个 iframe。与单击的每个选项卡相关的内容来源都在其他 html 和 css 文件中进行了格式化和编码。

使用 iframe 的另一种替代方法是什么,因为我注意到单击选项卡时,它仍然显示白色背景,类似于加载新页面时?

这是我的代码:

<div id="tabs">
<div id="overview">
  <a target="tabsa" class="imagelink lookA" href="toframe.html">Overviews</a>
</div>
<div id="gallery">
  <a target="tabsa" class="imagelink lookA" href="tawagpinoygallery.html">Gallery</a>
</div>
<div id="reviews">
  <a target="tabsa" class="imagelink lookA" href="trframe.html">Reviews</a>
</div>
</div>

<div id="tabs-1">
  <iframe src="toframe.html" name= "tabsa"   frameborder="0">
  </iframe>
</div>

【问题讨论】:

IFRAME 不是 Apple 产品。 不要写iFrame。 其实它也是苹果的产品——它是一种视频格式。 :) 请重命名问题并添加您正在寻找 tabs 实现。 【参考方案1】:

使用 IFRAME 加载动态内容(在页面加载后)的唯一替代方法是使用 AJAX 更新网页上的容器。它非常优雅,通常比将整个页面结构加载到 IFRAME 中更快。

Ajax with JQuery(使用它,您将在 SO 上被爱;AJAX 功能非常简单) Ajax with Prototype Ajax with MooTools Standalone Ajax with Matt Kruse's AJAX toolbox(以前用这个,今天用JQuery,因为需要一个框架) AJAX with Dojo(据说很快,但是AJAX没那么简单)

【讨论】:

这不是唯一的选择 - 请参阅我的答案以获得另一个选择。 DVK:好点,但我假设 OP 正在寻找动态加载数据。【参考方案2】:

如前所述,您可以使用 jQuery 或其他库来检索 HTML 文件的内容并将其填充到 div 中。然后你甚至可以做一个花哨的淡入淡出让它看起来很漂亮。

http://docs.jquery.com/Ajax/jQuery.get

类似的东西:

$.get("toframe.html", function(data)
  $("#tabs-1").html(data);
);

编辑.. 你可以预先填充或点击你可以做动态获取

$("#tabs a").click(function()
   var pagetoget = $(this).attr("href");
   $.get...
)

如果您预填充可以有三个容器,而不是现在的一个,2 个隐藏,1 个显示,并且单击功能将隐藏所有容器,除了您想要的那个。

虽然获取的代码更少,时间更容易。

【讨论】:

hmmm...所以如果我将此脚本添加到页面顶部,它会预加载 div 的内容吗?我是否可以在按下选项卡之前预加载所有选项卡内容而不显示它们? :) 查看添加的代码,我认为只是获取会更容易,但您可以预先填充它们并隐藏/显示。作为编码员的个人意见。【参考方案3】:

这是jQuery 示例,它将另一个html 页面包含到您的文档中。这比iframe 对 SEO 更友好。为了确保机器人没有索引包含的页面,只需将其添加为在robots.txt 中禁止@

<html>
  <header>
    <script src="/js/jquery.js" type="text/javascript">
  </header>
  <body>
    <div id='include-from-outside'></div>
    <script type='text/javascript'>
      $('#include-from-outside').load('http://example.com/included.html');
    </script> 
  </body>
</html>

您也可以直接从 Google 中包含 jQuery:http://code.google.com/apis/ajaxlibs/documentation/ - 这意味着可选的自动包含较新版本并显着提高速度。此外,这意味着您必须相信他们只会为您提供 jQuery ;)

【讨论】:

【参考方案4】:

另一种选择是使用 AJAX 加载选项卡的内容并使用 div 显示内容。我建议使用现有的选项卡库可能是一种选择,而不是尝试解决与创建选项卡相关的所有问题。

如果您想尝试一下,jQuery UI Tab 在这里可能会有所帮助。


编辑:带有 UI 选项卡的 AJAX 示例。

首先,HTML 将如下所示。

   <div id="tabs">
     <ul>
      <li><a href="toframe.html"><span>Overviews</span></a></li>
      <li><a href="tawagpinoygallery.html"><span>Gallery</span></a></li>
      <li><a href="trframe.html"><span>Reviews</span></a></li>
     </ul>
   </div>

然后确保导入适当的 jQuery 文件:

  <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/ui-lightness/jquery-ui.css" type="text/css" media="all" />
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js" type="text/javascript"></script>
  etc...

然后添加代码来创建标签:

   <script type="text/javascript">
$(function() 
    $("#tabs").tabs();
);
</script>

【讨论】:

如果我要使用 AJAX,我会怎么做? :) 尝试了 jQuery UI 选项卡,但效果不佳.. :( jQuery 选项卡小部件已经具有通过 AJAX 加载内容的选项,而且非常简单。它就像指定 URL 一样简单。让我看看能不能举个例子。【参考方案5】:

HTML iframe 用于包含/显示非模板内容,例如 PDF 文件。在 SEO 和 UX 意见中,用于模板内容(即 HTML)时,这被认为是不好的做法。

在您的情况下,您只想拥有一个选项卡式面板。这可以通过多种方式解决:

    有一堆链接作为标签和一堆 div 作为标签内容。最初只显示第一个选项卡内容并使用 CSS display: none; 隐藏所有其他内容。通过在标签内容 div 上相应地设置 CSS display: block;(显示)和 display: none;(隐藏),使用 JavaScript 在标签之间切换。

    有一堆链接作为选项卡,一个 div 作为选项卡内容。使用Ajax异步获取标签内容,使用JavaScript将当前标签内容替换为新内容。

    有一堆链接作为选项卡,一个 div 作为选项卡内容。让每个链接发送不同的 GET 请求参数或表示单击的选项卡的路径信息。使用服务器端流控制(phpif() 或 JSP 的 &lt;c:if&gt; 等)或包含功能(PHP 的 include() 或 JSP 的 &lt;jsp:include&gt; 等)以包含所需的选项卡内容,具体取决于参数/路径信息.

当使用基于 JavaScript 的方法时,我强烈建议采用 jQuery。

【讨论】:

【参考方案6】:

你不需要脚本。

<ul><li><a href="#foo">foo link</a><li><a href="#bar">bar link</a></ul>
<div class="tab" id="foo">foo contents</div>
<div class="tab" id="bar">bar contents</div>

加上这个 CSS,在大多数浏览器中:.tab:not(:target) display: none !important; ,如果 :target 不受支持(任何现代浏览器都支持),则默认为所有可见的内容。

如果您使用脚本显示内容,请始终使用脚本将其隐藏。如果该脚本没有运行,让它优雅地降级。

【讨论】:

【参考方案7】:

最好将每个选项卡的内容加载到同一页面上的 DIV 中,然后使用 JavaScript 和 CSS 显示属性在单击选项卡按钮时切换每个 DIV 的可见性。

如果您不能这样做,那么 iframe 可能是最好的解决方案。您可以使 iframe 背景透明,如下所示:

<iframe src="toframe.html" name= "tabsa"   frameborder="0" allowtransparency="true"></iframe>

然后您需要使用以下 CSS 将以下 CSS 添加到 BODY 元素:

BODY  Background: transparent; 

【讨论】:

看来我的答案也被打败了!哇,你必须在这里快速移动! 如果您要加载数百个需要在单击时加载的隐藏 怎么办?这对可扩展性有何影响?它在网站上是否非常缓慢?有这么多 【参考方案8】:

还有 AJAX 的替代方案

您可以将所有三个可能的内容加载到单独的 DIV 中。

然后单击一个选项卡只会使相应内容的 DIV 的显示属性“阻塞”,而使其他两个 DIV 的显示属性“无”。

便宜、简单,不需要额外的 http 请求或编码的 AJAX 费用。

请注意,如果选项卡的内容将根据其他数据动态更改,而不是在页面加载时已知,AJAX 是一个更好的解决方案。

【讨论】:

我将如何告诉代码将 div 设置为显示:按下选项卡时阻止? :) 选项卡的 onclick 处理程序将使用 getelementbyid() 找到适当的 DIV,然后更改该对象的 style.display 值

以上是关于更好的替代 iframe 来显示标签内容?的主要内容,如果未能解决你的问题,请参考以下文章

iframe---切换目录显示相应内容

android 怎么用TextView显示HTML的文本内容,包含<iframe>标签的视频内容,望解答

html页面中嵌套iframe标签,但不显示内容怎么回事? 不显示table.html

前端iframe标签介绍及使用

IE11 中的 iframe 内容仅显示白屏

每个网页的最大 <iFrame> 标记数