【问题标题】:Feeding HTML to IE6 Only仅将 HTML 提供给 IE6
【发布时间】:2010-11-29 02:13:15
【问题描述】:

如果浏览器是 IE6/IE7,我需要显示不同的 HTML。如果我们只讨论样式信息,我知道条件 cmets 可以正常工作,但在这种特殊情况下,它是实际的标记。

我将有一个无序列表的图像,这些图像将是 png-24。它们将具有圆角(因此需要 png-24 提供的透明度),并将在 CSS(3) 中具有圆角边框样式。由于 IE6 无法识别 png-24,我希望有一个替代图像列表,这些图像是 jpg 已经包含在图像中的边框。这将使 IE6/IE7 满意,而符合标准的浏览器将获得正确的版本。

(我这样做是因为该站点可能会增长到许多图像并且它需要轻松主题化。如果我在代码中生成边框,只需将边框颜色更改为一个简单的更改,它就会更改整个站点。我意识到IE 仍然必须是手动的,但如果他们真的希望 IE6 支持它,我可以为此单独收费。)

所以我的问题是使用 PHP 执行此操作的最佳方法是什么,有什么缺点吗?

【问题讨论】:

  • “我知道如果我们只是讨论样式信息,条件 cmets 可以正常工作,但在这种特殊情况下,它是实际的标记。”条件 cmets 对所有内容都适用,而不仅仅是链接到样式表。

标签: php internet-explorer-6 browser-detection


【解决方案1】:

您可以通过查看$_SERVER['HTTP_USER_AGENT']获取浏览器UA

Here 是 IE 的 UA 字符串列表。

【讨论】:

    【解决方案2】:

    您可以在 PHP 中检测它并发送不同的 HTML:

    $using_ie6 = ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== FALSE) || (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6,0') !== FALSE));
    if ($using_ie6) {
        ...
    }
    else {
        ...
    }
    

    这种方法的缺点是,显然 Opera 有时会在其用户代理标头中发送MSIE 6,这也可能与 IE mobile 匹配。

    将不同的内容发送到不同的浏览器通常是最好的做法,尽可能避免 - 你最终会得到大量重复的代码,并带来所有固有的弊端。

    【讨论】:

    • 我会删除“。” 6后作为第一个版本是IE6使用了','
    • 我在6,0 的特定检查中进行了编辑 - 也许我很着迷,但是嘿,有一天可能会有 IE 60... ;-)
    【解决方案3】:
    $is_ie6 = (isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6') !== false));
    

    【讨论】:

      【解决方案4】:

      如果需要,您可以将其设置为客户端,如下所示: 制作两个 div,一个用于 IE,另一个用于浏览器的其余部分。 IE 的 DIV 将具有 display=none;然后您将添加一个条件 CSS,仅适用于 IE,您将为其他浏览器隐藏 div 并设置 IE display=block

      【讨论】:

        【解决方案5】:

        只是一个不同的建议,在 PHP 中也应该可以。在 ASP.NET 中,您可以编写能够将各种二进制数据发送回客户端的特殊处理程序。您可以将图像标签链接到特殊的图像处理程序,而不是重写您的页面。该处理程序将接收请求,检查来自客户端的用户代理字符串以检测浏览器版本,如果是 IE6,它会将 PNG 转换为 JPG 文件并将其流式传输回来。在其他情况下,它只会返回 PNG 文件。

        您的网址会有点像http://example.org/yourpage.php?yourimage

        基本上,您会在更接近问题根源的地方解决问题。并且已经解释了检测IE6。

        【讨论】:

          【解决方案6】:

          使用条件 cmets - 它们非常适合标记,而不仅仅是样式信息:

          <!--[if lte IE 6]>
          <p>Old school</p>
          <![endif]-->
          

          参见 MSDN:About Conditional Comments

          【讨论】:

          • +1。这是向 IE 6 提供自定义内容的最佳方式(除非您出于某种原因绝对不希望其他浏览器的用户看到特定于 IE6 的内容)。在服务器上嗅探用户代理将导致您将 IE6 特定内容发送给伪装成 IE 6 的机器人和爬虫,最重要的是,不会不会将 IE6 特定内容发送给那些已更改其用户代理或完全阻止它(某些公司和安全软件会这样做)。
          【解决方案7】:

          有什么缺点吗?

          哦,是的,非常喜欢。您必须输出一个“Vary”标头来告诉代理/缓存页面对于每个 UA 字符串都是不同的,这会破坏缓存的有效性。 (如果你不这样做,浏览器会看到带有错误标记的页面。)当然,许多浏览器只是谎称它们是什么。我会尽可能避免 UA 嗅探 — 而且几乎总是可以的。

          条件 cmets 对于以更简单的标记呈现 IE 的特定情况要好得多。您可以在 HTML 中的任何位置使用它们,但请注意 MS 提出的用于下层显示标记的语法是无效的。对于仅针对 IE6 的内容,请尝试:

          <!--[if lt IE 7]>
              (markup for IE6)
          <![endif]-->
          
          <!--[if gte IE 7]><!-->
              (markup for everyone else)
          <!--<![endif]-->
          

          在 IE6 无法识别 png-24 的情况下,我想要一个替代的图像列表,这些图像是 jpg 已经包含在图像中的边框。

          您是否尝试过许多PNG fixes 中的一种来使IE6 中的透明度工作?这比拥有单独的图像和标记要容易得多(而且看起来更好)。

          【讨论】:

            【解决方案8】:

            我知道这不是你问的,但无论如何我都会做到的。

            在 IE 6 中使用 8 位 PNG 图像。它看起来与 24 位的不一样,但这样可以避免创建额外的标记,只需一个额外的样式表,其中一行替换背景图像.

            通过不为有故障的浏览器创建自定义标记,您赢得了相当多的时间,最终结果非常接近您想要的 - 特别是如果您目前可以在透明 PNG 中使用不透明的 JPEG。

            确实不应该对 IE6 太好,尽管我确实(不幸地)知道并不总是可以自行选择它。

            【讨论】:

              【解决方案9】:

              是否有可能使用诸如 javascript 之类的库来实现以下效果:

              <!--[if ie]>
               // remove the #for_non_id_browsers and replace, using an ajax call or whatever, with an IE-suitable version
              <![endif]-->
              
              <div id="for_non_ie_browsers">
              Page content
              </div>
              

              【讨论】:

                猜你喜欢
                • 2015-10-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-11-28
                • 1970-01-01
                • 2018-06-14
                • 2022-12-17
                • 2016-08-24
                相关资源
                最近更新 更多