2009-08-03 134 views
6

我有两个截然不同的网站。在“Internet Explorer 8”浏览器模式下显示时,它们都有不同的错误!沮丧:不能强迫IE 8进入“兼容性视图”!

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

然后我想强制“Internet Explore 8”进入“浏览器模式”:“IE8兼容视图”,这样我的用户就不必点击地址栏旁边的“兼容性视图”按钮来获取他们真的需要看到什么。

我能想到这样做的唯一方法是通过插入标题下方的元标记类似这样的标题里:

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

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

这很令人沮丧,为什么我不能强制“IE8兼容视图”浏览器模式而不是“Internet Explore 7”或“Internet Explore 8”浏览器模式?

+0

我有同样的确切问题,很高兴我找到了你的文章。尽管下面有一些很好的答案,你最终做了什么来解决这个问题?我唯一的区别是,我通过头部而不是元标记设置了“X-UA-Compatible:IE = EmulateIE7”,但存在同样的问题。我正在使用一些第三方控件,并且它们只在IE8中正常运行,当用户单击浏览器上的compat按钮或选择“在兼容性视图中显示所有网站”时,标题或meta的确如您所描述的那样:( – felickz 2012-02-24 14:53:47

回答

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

+0

There's没有什么错误的doctype。有很多原因不使用XHTML,但这是一个完全不同的问题。 – 2009-08-03 21:54:57

+0

即使有什么问题。按我的“兼容性视图”按钮忽略这一点,并完美地显示该网站 – 2009-08-05 18:41:17

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执行路径不同: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)); 

...你发现了缺陷(提示:比较线2和段4)?

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

var is_ie6up = (is_ie6 || is_ie7up); 

......但是等等。这也不好,因为代码段的第3行改变is_ie7up只有当浏览器正好是IE7时才是真的!因此,您需要删除is_ie7up的覆盖,并修复is_ie6up的设置。

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

+0

“为什么浏览器模式对你来说很重要?” 这很重要,因为我需要强制/触发第三种浏览器模式“Internet Explore 8兼容性查看“,因为只有在这种模式下,我的网站看起来是正确的。EmulateIE7触发”Internet Explore 8“浏览器模式和”IE7 Standards“doc在我的情况下,这在视觉上与“Internet Explore 8兼容性视图”不同,它看起来是错误的。 – 2009-08-05 18:37:04

2

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

要告诉你的用户会看到:开发人员工具栏中

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

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

0

我正在转换XML文档,因此无法正确设置DOCTYPE。而不是移动到<html>以上,这是XML无效的,我只是把它放在一个标题。

在PHP:

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

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

1

更新网站在我的具体情况我的网站将不会在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 NOT DocumentModes(可以通过元标记,响应标题等来控制)。