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"浏览器模式?
要引用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
.
我的猜测是你在另一个网站上遇到了完全相同的问题:你以同样的方式搞砸了浏览器检查.
问题不是您使用了错误的文档类型吗?
或许:
<!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。