好端端的W3C标准页面被硬生生渲染成IE5,惨不忍睹。而在F12工具中强制调成IE9标准渲染模式,全部正常。于是研究了一下问题在哪。
关于X-UA-Compatible和IE的Quirks Mode模式,Google一下有很多说明,这里有三篇很详细的文章:
[1] http://msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx
[2] http://www.fantxi.com/blog/archives/browser-mode/
由于手上的一个项目,用到ExtJS,而版本也是3.0的,后发现在IE9中,ExtJS里的tree控件不能点击了,发现ExtJS3.0不支持IE9的,只有想其他办法,第一想法就是让IE9默认采用IE8的兼容模式运行。
将以下代码放于里面,最好是放在离最近的一个元素。
1
|
<metahttp-equiv="X-UA-Compatible"content="IE=9"/>
|
另查到资料,说以下代码也行,但是怎么测试都行不通,是不是脸大的缘故,总之呢,下面的一个不行,上面一个肯定行,自己试下吧。
1
|
<metahttp-equiv="X-UA-Compatible"content="IE=EmulateIE8"/>
|
这样IE9打开该页面就默认用IE8的兼容模式进行渲染,不兼容的问题就解决了。
但是呢,不知道是不是我脸大的缘故,在IE9下面,iframe本来好好的,但是一加入:
1
|
<metahttp-equiv="X-UA-Compatible"content="IE=9"/>
|
iframe的高度瞬间崩溃了,这个纠结啊,搞了2个小时,搞不定,那也只好将就下吧,如果IE9就插入这段代码,但是要注意,千万不要用以下代码:
1
2
3
|
<!--[ifIE 9]>
<meta http-equiv="X-UA-Compatible"content="IE=9"/>
<![endif]-->
|
上面第注释的代码无论如何设置content都是无效的,IE9不会识别。搜索了一下,发现有两种说法。一种认为在X-UA-Compatible之前必须至少有一个meta标签[4]。另一种说法是X-UA-Compatible之前不能有script标签[5],后一种说法应该是比较靠谱的,因为在官方的说明文章里有这么一句[1]:
The X-UA-Compatible header is not case sensitive; however, it must appear in the header of the webpage (the HEAD section) before all other elements except for the title element and other meta elements.
但问题是我源码的相应位置并没有script标签。迟疑很久,我怀疑是之前IE注释的问题,不仅如此,经过调试发现这些注释在IE中根本没有生效(IE注释的作用见参考资料[6])。于是试着把它去掉变成:
1
2
3
4
5
6
|
<head>
<title>1600ML! 微车世界 管理中心</title>
<meta http-equiv="X-UA-Compatible"content="IE=9"/>
<meta http-equiv="Content-Type"content="text/html; charset=utf-8">
<meta content="1600ML Inc." name="Copyright"/>
</head>
|
如果是php脚本的话,可以做个判断,这样就可以避免其他的一些问题,相关代码:
1
2
3
4
5
6
|
<?php
$mbrowser= $_SERVER['HTTP_USER_AGENT'];
if(strpos($mbrowser, 'MSIE 9.0')){
$xuacompatible= '<meta http-equiv="X-UA-Compatible" content="IE=9" />';
}
?>
|
然后将变量放入html代码里,这样就可以进行浏览器判断了。
附上主流的浏览器判断:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?php
if(strpos($mbrowser, 'MSIE 9.0')){
//省略自写
}
if(strpos($mbrowser, 'MSIE 8.0')){
//省略自写
}
if(strpos($mbrowser, 'MSIE 7.0')){
//省略自写
}
if(strpos($mbrowser, 'MSIE 6.0')){
//省略自写
}
if(strpos($mbrowser, 'Opera')){
//省略自写
}
if(strpos($mbrowser, 'Chrome')){
//省略自写
}
if(strpos($mbrowser, 'Firefox')){
//省略自写
}
//其他如出一辙……
?>
|
结论:X-UA-Compatible最好紧跟在head之后,之前不要有任何不标准的标签。
IE中存在多个文档模式,比如Quirks Mode,Standard Mode等。 这给Web开发者造成不少困惑。以下流程图全面完整解释了IE9是如何判断选择文档模式的,请参考。
from:http://blog.csdn.net/z69183787/article/details/20609101