【问题标题】:How can I identify IE8 and below to post unique code?如何识别 IE8 及以下版本以发布唯一代码?
【发布时间】:2014-06-04 17:37:54
【问题描述】:

我打算在我的 CMS 的标题中放置一些代码,以提醒所有使用 IE 8 及以下版本的用户,建议升级他们的浏览器。

在 PHP 中,我有以下代码,它适用于所有版本的 IE

<?php
    if(preg_match('/(?i)msie [1-8]/',$_SERVER['HTTP_USER_AGENT'])) {
        // if IE<=8
        ?>
            <!--[if lte IE 8]>
            <div class="ieNotice">
                <a href="http://windows.microsoft.com/en-us/internet-explorer/" target="_blank">
                    <img src="/skin/frontend/default/hellowired/images/ieUpgrade.jpg">
                </a>
            </div>
            <style>
                .ieNotice {
                    background-color: #eee;
                    padding: 10px;
                }
            </style>
            <![endif]-->
        <?php
    }
?>

这应该工作两次。一,$_SERVER['HTTP_USER_AGENT']) 应该能够区分浏览器。但是,我注意到当我运行跨浏览器测试时,IE 8 和 UP 会返回 $_SERVER['HTTP_USER_AGENT']) 的相同结果,即:

Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.1;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Media Center PC 6.0 )

好的...即使那不起作用...“怪癖模式”条件 cmets 不会作为后备只显示图像并链接到 IE8 及以下版本吗? 我在这里错过了什么?

编辑

好的,所以我按照指示做了。我已删除 PHP 代码,并将 .ieNotice 类与 display: none 属性放在一起。现在,在此处包含的样式表上:

<!--[if lte IE 8]>
<link rel="stylesheet" type="text/css" href="/skin/frontend/default/hellowired/css/styles-ie-lte8.css" media="all" />
<![endif]-->

我添加了以下行:

.ieNotice { display: block !important;}

我已经在 Firefox 和 Chrome 上正常看到了这项工作,但它仍然显示我为 IE 9、10 和 11 创建的横幅。

【问题讨论】:

  • 为什么还要检查 UA 字符串?条件 cmets 为您进行过滤 - 您不必担心任何其他浏览器或更新版本的 IE 会看到它们的内容。这就是条件 cmets 的全部意义所在。
  • 这是在head 还是body
  • 它在身体里,现在在头脑里。我已经删除了 UA 字符串检查。

标签: php html regex internet-explorer-8 conditional-comments


【解决方案1】:

您不应依赖可能被用户欺骗的用户代理字符串。特别是因为您已经在使用&lt;!--[if lte IE 8]&gt;,它只会出现在IE &lt;= 8 上。我会完全摆脱 PHP 条件。

【讨论】:

  • 我同意山姆的观点。如果用户代理字符串包含Windows version 较低的 NT 6.0,则可能更有意义的是在 PHP 文件中更改带有条件块的消息(文件)显示为 IE
  • 我明白你在说什么,莫菲,我很乐意这样做。不幸的是,我的手被上级给我的指示束缚住了。我进行了一些更改,但仍无法按预期运行。
【解决方案2】:

好的...即使这不起作用...“怪癖模式”条件 cmets 不会作为后备只显示图像并链接到 IE8 及以下版本吗? 我在这里错过了什么?

您似乎错误地认为条件 cmets 只能在 quirks 模式下工作。它们不受此限制;无论使用哪种文档模式,IE 直到 9 版(包括版本 9)都会尊重它们,并且从 10 版开始的 IE 以及所有其他浏览器都会像任何常规 HTML 注释一样完全忽略它们。

如前所述,服务器端检查是完全没有必要的,而且由于 UA 欺骗的可能性,甚至可以破坏东西,因此应该将其删除。您的条件注释将按设计自行工作。

【讨论】:

  • 谢谢 BoltClock。我已经进行了更改,但由于某种原因,它仍然在 9、10 和 11 上显示横幅。我已经在上面发布了我的编辑。任何帮助都会很棒。
【解决方案3】:

&lt;div&gt;&lt;a&gt;&lt;img&gt; 的出现让我觉得这是位于页面的body&lt;!--[if lte IE 8]&gt; 应该在head 中。

如果您想隐藏div,则默认将其设为display:none;,然后仅在使用时使用&lt;!--[if lte IE 8]&gt;style 将其设为display:block(或您选择的任何其他显示方法) IE8 或更低。

【讨论】:

  • 正确!因此,我进行了一些更改,但仍然没有体验到我希望体验的内容,因为 IE 9、10 和 11 无法正确显示横幅。我已经在上面发布了我的编辑。
  • 确保在 styles-ie-lte8.css 之前首先调用默认样式表,并且在 IE8 版本中放置 !important 也可能很有用,以防万一。还要仔细检查一种样式是否具有display:none;,另一种样式具有display:block;,如果它们都相同,则不会发生任何事情。
  • 你是对的!我意识到我在我的问题中在这里输入了错误的代码,我已经修复了。 IE8 样式表有 .ieNotice { display: block !important;} 而不是 display: none; ...但是我仍然没有得到专门为 IE8 及以下版本显示的图像和链接。
  • 默认样式表有.ieNotice { display: none;},styles-ie-lte8.css 有.ieNotice { display: block !important;}?它仍然在所有浏览器上显示相同?还要注意的是,任何形式的&lt;!--[if IE]&gt; 都不适用于 IE9+
  • MSIE处理如下:&lt;!--[if lt IE 7]&gt; &lt;![endif]--&gt; &lt;!--[if IE]&gt; &lt;link rel="stylesheet" type="text/css" href="/skin/frontend/default/hellowired/css/styles-ie.css" media="all" /&gt; &lt;![endif]--&gt; &lt;!--[if lte IE 8]&gt; &lt;link rel="stylesheet" type="text/css" href="/skin/frontend/default/hellowired/css/styles-ie-lte8.css" media="all" /&gt; &lt;![endif]--&gt; &lt;!--[if lt IE 7]&gt; &lt;script type="text/javascript" src="/js/lib/ds-sleight.js"&gt;&lt;/script&gt; &lt;![endif]--&gt;
猜你喜欢
  • 2012-11-28
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
相关资源
最近更新 更多