IE8发布之后,市场份额在节节上升当中。由于目前Windows 7在市场当中的反响相当不错,相信随着Windows 7的上市,IE8的市场份额更会打着滚儿的上升。
对于网站主来说,除了做好IE8的兼容之外(其实就是W3C的标准兼容),还有一个细节需要注意,那就是如何来判断当前用户使用的是不是IE8。有很多哥们儿就说了,这还不容易吗?使用UserAgent不就可以了,根据当前的UserAgent字符串,查看一下是不是IE8?类似于展波兄给出的如何判断.NET版本一样。(alert(navigator.userAgent);)
如果你真的认为使用这个字符串就可以正确判断目标浏览器的版本号,那就有些很傻很天真了。作为一个完全兼容W3C标准的微软浏览器,在IE8当中为了照顾目前世面上大部分网站的需要,其总共提供了三个渲染引擎,即IE8标准模式,IE7的兼容模式,以及IE6的Quirks模式。而IE8的UserAgent字符串也会动态的根据渲染引擎不同而采用不同的字符串。比如以下三种情况:
1. 在最终用户访问你的网站时,点击了地址栏右侧兼容模式按钮;
2. 你的网站中的相应页面使用了IE7兼容字符串,即<meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible"/>,或者在Web服务器 (IIS/Apache)的HTTP Header信息当中作了相应的设置;
3. 微软为了协助贵公司的网站页面在IE8下显示更加兼容,在IE8兼容列表当中将贵公司的网站地址加入了一个Windows Update维护列表中(如果您的网站在此列表当中,并且您相信您的网站其实已经完全兼容W3C标准,所以想从此列表移除,可以发送邮件至iepo@microsoft.com申请移除)。
那么在以上三种情况下,你得到的UseAgent字符串将会是IE7,而不是IE8。
那么如何正确判断当前浏览器是不是IE8呢? 使用以下代码即可:
1function getInternetExplorerVersion()
2// Returns the version of Windows Internet Explorer or a -1
3// (indicating the use of another browser).
4{
5 var rv = -1;
6 // Return value assumes failure.
7 if (navigator.appName == 'Microsoft Internet Explorer') {
8 var ua = navigator.userAgent;
9 var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
10 if (re.exec(ua) != null)
11 rv = parseFloat(RegExp.$1);
12 }
13 return rv;
14}
15function checkVersion() {
16 var msg = "You're not using Windows Internet Explorer.";
17 var ver = getInternetExplorerVersion();
18 if (ver > -1) {
19 if (ver >= 8.0)
20 msg = "You're using a recent copy of Windows Internet Explorer."
21 else
22 msg = "You should upgrade your copy of Windows Internet Explorer.";
23 }
24 alert(msg);
25}
26
其实此问题,是我负责的一个客户前端时间询问我的。美国一个好哥们Giorgio Sardo帮我解决了此问题。在他的贴子当中,还有其它一些您可能感兴趣的内容,比如如何判断当前浏览器是否支持网页快讯(WebSlice),加速器(Accelerator)以及可视化搜索(Visual Search)等。您也可以一并阅读。
1 function WebSliceSupported()
2 {
3 return (typeof (window.external.AddToFavoritesBar) != "undefined");
4 }
5 function AcceleratorSupported ()
6 {
7 return (typeof (window.external.AddService) != "undefined");
8 }
9 function VisualSearchSupported()
10 {
11 return (typeof (window.external.AddService) != "undefined");
12 }
13
[文章来自:开心大哥Blog]