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

时间:2009-08-03 21:26:55

标签: internet-explorer-8 view compatibility forcing

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

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

然后我想强制“Internet Explore 8”进入“浏览器模式”:“IE8 Compat 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 Compat视图”,“文档节点”为“IE7标准”,但“浏览器模式”为“IE8”,“文档模式”为“IE7标准”,与在“Internet Explorer 8”浏览器模式下查看时相比,网站突然出现了一组新的错误!

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

8 个答案:

答案 0 :(得分:5)

quote the IEBlog

  

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

有关http://msdn.microsoft.com/en-us/library/dd565624(VS.85).aspx的详细信息。

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

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

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

修改

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

如果您使用开发人员工具调试菜单放置脚本,您可以深入了解当浏览器将自身报告为IE7或IE8时get_x_position的执行路径不同:IE7将is_ie5up设置为true模式,对于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));

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

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

var is_ie6up    = (is_ie6   || is_ie7up);

......但等等。这也不好,因为如果浏览器正好是IE7,那么代码段的第3行会将is_ie7up更改为true!因此,您需要删除is_ie7up的覆盖,并修复is_ie6up的设置。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在我的特定情况下,我的网站无法在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进入&#34;浏览器模式:IE8 Compat View&#34;进入&#34;浏览器模式:IE8&#34;。我再次谈论BrowserModes NOT DocumentModes(可以通过元标记,响应头等控制)。

答案 4 :(得分:0)

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

也许:

<!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

答案 5 :(得分:0)

我正在转换XML文档,因此无法正确设置DOCTYPE。我没有移动到{无效的<html>之上,而是将其放在标题中。

在PHP中:

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

答案 6 :(得分:0)

使用HML5 Boilerplate为asp经典网站强制IE8进入文档模式IE8标准的问题。将这个问题和其他问题拼凑在一起,在<doctype>声明之上添加此代码似乎解决了问题,并迫使文档模式从IE7回到IE8。 <%= response.AddHeader("X-UA-Compatible", "IE=edge") %>

答案 7 :(得分:0)

如果您的网页包含ASP.NET Ajax内容,则可能需要使用此

更新网站

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