令人沮丧:无法强制IE 8进入"兼容性视图"!

May*_*sen 6 compatibility view internet-explorer-8 forcing

我有两个非常不同的网站.在"Internet Explorer 8"浏览器模式下显示时,它们都有不同的错误!

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

然后我想强制"Internet Explore 8"进入"浏览器模式":"IE8 Compat视图",这样我的用户就不必单击地址栏旁边的"兼容性视图"按钮来获取他们真正需要的内容查看.

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

<!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>
Run Code Online (Sandbox Code Playgroud)

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

令人非常沮丧的是为什么我不能强制使用"IE8 Compat view"浏览器模式而不是"Internet explore 7"或"Internet explore 8"浏览器模式?

Mic*_*sen 5

引用IEBlog:

"浏览器模式"会影响用户代理字符串,评估条件注释时使用的版本向量以及呈现模式.

它详细介绍了http://msdn.microsoft.com/en-us/library/dd565624(VS.85).aspx.

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

也许真正的问题是:为什么浏览器模式对你来说有多重要?文档模式是你最关心的 - 浏览器模式的所有变化都与渲染有关,与被排除/包含的内容有关,但是版本检查,用户无论如何都不会查看开发人员工具,所以他们不在乎.

您应该确保用户代理字符串检查和条件注释确保IE7和IE8使用相同的材​​料,而不是浪费大量时间让它看起来像开发人员工具中的纯兼容模式,然后离开EmulateIE7.

编辑:

问题是你的版本检查,正如我在下面所承诺的那样,我将告诉你问题出在哪里.

如果使用开发人员工具调试菜单放置脚本,则可以深入了解当浏览器将自身报告为IE7或IE8时,get_x_position的执行路径不同:is_ie5up对于IE7模式,设置为true,对于IE8模式,设置为false.这导致返回非常不同的值.

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

var is_ie5up    = (is_ie6up || (is_ie  && !is_ie3 && !is_ie4));
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这取决于它的值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));
Run Code Online (Sandbox Code Playgroud)

...你发现了这个漏洞(提示:比较那个片段的第2和第4行)?

这是正确的:is_ie6up除非浏览器完全是IE6或IE7,否则不会设置为true.当然应该阅读正确的行

var is_ie6up    = (is_ie6   || is_ie7up);
Run Code Online (Sandbox Code Playgroud)

...可是等等.这也不好,因为is_ie7up如果浏览器正好是IE7 ,那么片段的第3行只会变为真!因此,您需要删除覆盖is_ie7up,并修复设置is_ie6up.

我的猜测是你在另一个网站上遇到了完全相同的问题:你以同样的方式搞砸了浏览器检查.


Law*_*Dol 0

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

或许:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Run Code Online (Sandbox Code Playgroud)

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