0

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

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

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

所以我的问题是使用 PHP 做到这一点的最佳方法是什么,有什么缺点吗?

4

9 回答 9

5

您可以在 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 移动相匹配。

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

于 2009-09-17T09:36:53.257 回答
4

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

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

请参阅 MSDN:关于条件注释

于 2009-09-17T09:54:05.250 回答
2
$is_ie6 = (isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6') !== false));
于 2009-09-17T09:37:22.707 回答
1

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

是 IE 的 UA 字符串列表。

于 2009-09-17T09:36:00.900 回答
1

有什么缺点吗?

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

对于以更简单的标记呈现 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 修复中的一种来使透明度在 IE6 中起作用?这比拥有单独的图像和标记要容易得多(并且看起来更好)。

于 2009-09-17T10:00:37.157 回答
0

是否有可能使用诸如 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>
于 2009-09-17T10:28:55.897 回答
0

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

于 2009-09-17T09:37:23.270 回答
0

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

你的 URL 看起来有点像http://example.org/yourpage.php?yourimage

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

于 2009-09-17T09:40:01.877 回答
0

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

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

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

一个对 IE6 真的不应该太好,尽管我确实(不幸地)知道它并不总是可以做出你自己的选择。

于 2009-09-17T10:19:16.613 回答