【问题标题】:Frustrating: Can't force IE 8 into "Compatibility view"!令人沮丧:不能强制 IE 8 进入“兼容性视图”!
【发布时间】:2014-04-26 00:36:14
【问题描述】:

我有两个非常不同的网站。两者在“Internet explorer 8”浏览器模式下显示的错误不同!

点击地址栏旁边的“兼容性视图”按钮时,两个网站看起来都很棒。当我之后使用内置的“开发者工具”查看“浏览器模式”和“文档节点”时,我还注意到“浏览器模式”是“IE8 兼容视图”,“文档模式”是“IE7 标准” ”。正如我所期望的那样。

然后我想强制“Internet Explorer 8”进入“浏览器模式”:“IE8 Compat view”,这样我的用户就不必点击地址栏旁边的“Compatibility view”按钮来获得什么他们真的需要看看。

我能想到的唯一方法是在标题下方插入一个元标记,如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
    <head>
        <title>Test</title>
        <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
        <link ... />
        <script ...></script>
    </head>
    <body>
        ...
    </body>
</html>

然后我重新加载网站,地址栏旁边的“兼容性视图”按钮消失。正如预期的那样。当我之后使用内置的“开发者工具”查看“浏览器模式”和“文档节点”时,我突然看到了一些我真的没想到的东西。我希望“浏览器模式”是“IE8 兼容视图”,“文档节点”是“IE7 标准”,但“浏览器模式”是“IE8”,“文档模式”是“IE7 标准”,而与在“Internet Explorer 8”浏览器模式下查看相比,网站突然出现一组新错误!

为什么我不能强制“IE8 Compat view”浏览器模式而不是“Internet explore 7”或“Internet explore 8”浏览器模式,这很令人沮丧?

【问题讨论】:

  • 我也有同样的问题,很高兴找到你的帖子。虽然下面有一些很好的答案,但您最终做了什么来解决这个问题?我唯一的区别是我通过标题而不是元标记设置“X-UA-Compatible:IE = EmulateIE7”,但存在同样的问题。我正在使用一些第 3 方控件,当用户单击浏览器上的兼容按钮或选择“在兼容性视图中显示所有网站”时,它们仅在 IE8 中正确运行。标题或元数据完全按照您的描述进行:(跨度>

标签: internet-explorer-8 view compatibility forcing


【解决方案1】:

quote the IEBlog

“浏览器模式”会影响用户代理 字符串,何时使用的版本向量 评估条件 cmets,以及 渲染模式。

http://msdn.microsoft.com/en-us/library/dd565624(VS.85).aspx 上更详细。

您可以清楚地看到,无论如何您都无法影响所有这些事情:当您告诉浏览器像 IE7 一样运行时,它已经像 IE8 一样运行了。

也许真正的问题是:为什么浏览器模式对您来说如此重要?文档模式是您最应该关心的 - 浏览器模式发生的所有变化渲染涉及到排除/包含但版本检查的内容,并且用户无论如何都不会查看开发人员工具,所以他们不会在意。

与其浪费大量时间让它看起来像开发人员工具中的纯兼容模式,不如去确保用户代理字符串检查和条件 cmets 能够做到这一点,以便 IE7 和 IE8 获得相同的材料使用,然后将 EmulateIE7 留在其中。

编辑:

问题在于您的版本检查,正如我在下面承诺的那样,我将告诉您问题出在哪里。

如果你使用开发者工具调试菜单放置脚本,可以深挖一下,当浏览器自报为IE7或IE8时get_x_position的执行路径不同:is_ie5up设置为true为IE7模式, IE8 模式为 false。这会导致返回非常不同的值。

此时,我们必须回到设置此变量的位置:

var is_ie5up    = (is_ie6up || (is_ie  && !is_ie3 && !is_ie4));

如您所见,这取决于is_ie6up的值,所以我们看看周围的代码...

var is_ie8up    = (is_ie8   ||  is_ie9up);
var is_ie7up    = (is_ie7   ||  is_ie8up);
var is_ie7up    = (is_ie7);
var is_ie6up    = (is_ie6   || is_ie7);
var is_ie5up    = (is_ie6up || (is_ie  && !is_ie3 && !is_ie4));
var is_ie5_5up  = (is_ie6up || (is_ie && !is_ie3 && !is_ie4 && !is_ie5));

...你发现缺陷了吗(提示:比较那个 sn-p 的第 2 行和第 4 行)?

没错:is_ie6up 不设置为 true,除非浏览器是 IE6 或 IE7。正确的行当然应该是

var is_ie6up    = (is_ie6   || is_ie7up);

...但是等等。这也不好,因为 sn-p 的第 3 行将 is_ie7up 更改为仅在浏览器完全是 IE7 时才为真!所以,你需要删除is_ie7up的覆盖,修复is_ie6up的设置。

我的猜测是您在其他网站上遇到了完全相同的问题:您以几乎相同的方式搞砸了浏览器检查。

【讨论】:

  • "为什么浏览器模式对您来说如此重要?"这很重要,因为我需要强制/触发第三种浏览器模式“Internet Explorer 8 兼容性视图”,因为只有在这种模式下,我的网站才看起来正确。 EmulateIE7 触发“Internet explore 8”浏览器模式和“IE7 标准”文档模式,但在我的情况下,这在视觉上与“Internet Explorer 8 兼容性视图”不同,而且看起来是错误的。
  • 其中一个站点的 URL 是:topotarget.comtopotarget.com/index_test.dsp,您可以看到打开 EmulateIE7 的站点的首页。希望这可以帮助您理解我的问题。
  • 关于开发者工具:我只用它来调试以证明我在这个问题上的观点。所以我理解你的意思。
  • 如前所述,问题出在您的版本检查中。我将编辑我的帖子,以准确显示哪里出了问题。
【解决方案2】:

您已正确设置元标记,但 IE8 似乎使用以前的呈现模式,直到您重新启动浏览器。

告诉您的用户将看到什么:

  1. 点击开发者工具栏中的Document Mode,看看哪个值被标记为(Page Default)
  2. 重新启动 IE8 并查看您的文档 - IE 现在应该使用默认页面。

【讨论】:

    【解决方案3】:

    xmlns="http://www.w3.org/1999/xhtml" 属性取消了元标记。将元标记移动到 html 标记上方。是的,没错,在 html 标签之上。然后它将在 javascript 运行之前执行 emulateIE7。我在 IE7、IE8 和 Firefox 中对此进行了测试。

    【讨论】:

    • 是的!我在“If IE”语句中使用了“emulateIE7”,该语句一旦被删除并位于 HTML 之上,它就起作用了。这个技巧终于对我有用了,谢谢。
    【解决方案4】:

    在我的特殊情况下,我的网站无法在 Compat View 中正确呈现。我终于了解到浏览器模式会影响用户代理字符串。我的站点样式规则基于用户代理,因此某些样式根本没有在 Compat 视图中应用。

    我正在使用

    document.documentElement.setAttribute('data-useragent', navigator.userAgent);

    这样以后我可以使用像

    这样的 css 属性选择器
    html[data-useragent*='MSIE 8.0'] p {}

    我通过添加解决了:

    html[data-useragent*='MSIE 7.0'] p {}

    (不关心真正的 IE7,因为不支持真正的 IE7)

    根据我的经验,开发人员无法强制 IE8 从“浏览器模式:IE8 兼容视图”进入“浏览器模式:IE8”。同样,我说的是 BrowserModes 而不是 DocumentModes(可以通过元标记、响应标头等控制)。

    【讨论】:

      【解决方案5】:

      问题不在于您使用了错误的文档类型吗?

      也许:

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      

      有关详细信息,请参阅http://htmlhelp.com/tools/validator/doctype.html

      【讨论】:

      • 文档类型并没有什么问题。有很多理由不使用 XHTML,但那是完全不同的事情。
      • 即使出现问题。在我的情况下按下“兼容性视图”按钮会忽略这一点并完美地显示该站点。 EmulateIE7 应该真的一样。这很明显。
      【解决方案6】:

      我正在转换 XML 文档,因此无法正确设置 DOCTYPE。我没有在 XML 无效的 &lt;html&gt; 上方移动,而是将其放在标题中。

      在 PHP 中:

      header("X-UA-Compatible: IE=7");
      

      【讨论】:

        【解决方案7】:

        使用 HML5 Boilerplate 将 IE8 强制转换为文档模式 IE8 标准时遇到问题。将这个问题和其他问题的答案拼凑在一起,在&lt;doctype&gt; 声明上方添加此代码似乎已经解决了问题并将文档模式从 IE7 强制返回到 IE8。 &lt;%= response.AddHeader("X-UA-Compatible", "IE=edge") %&gt;

        【讨论】:

          【解决方案8】:

          如果您的页面包含 ASP.NET Ajax 内容,您可能需要使用此更新站点

          http://support.microsoft.com/kb/2600088

          【讨论】:

            猜你喜欢
            • 2013-01-05
            • 2013-01-03
            • 2012-12-17
            • 1970-01-01
            • 1970-01-01
            • 2012-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多