<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>春去花还在-CoLee★＂ &#187; 判断</title>
	<atom:link href="http://colee.99n9.com/tag/%e5%88%a4%e6%96%ad/feed/" rel="self" type="application/rss+xml" />
	<link>http://colee.99n9.com</link>
	<description>CoLee的网页设计制作素材、html、javacript、ajax代码精心自编或修改收藏，欢迎大家共享与交流。</description>
	<lastBuildDate>Tue, 04 Aug 2009 03:51:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JavaScript判断浏览器类型及版本</title>
		<link>http://colee.99n9.com/javascript%e5%88%a4%e6%96%ad%e6%b5%8f%e8%a7%88%e5%99%a8%e7%b1%bb%e5%9e%8b%e5%8f%8a%e7%89%88%e6%9c%ac/</link>
		<comments>http://colee.99n9.com/javascript%e5%88%a4%e6%96%ad%e6%b5%8f%e8%a7%88%e5%99%a8%e7%b1%bb%e5%9e%8b%e5%8f%8a%e7%89%88%e6%9c%ac/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 05:56:04 +0000</pubDate>
		<dc:creator>CoLee★＂</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[判断]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[版本]]></category>
		<category><![CDATA[类型]]></category>

		<guid isPermaLink="false">http://colee.99n9.com/?p=83</guid>
		<description><![CDATA[实例效果在下面,也可以点击这里前往
你知道世界上有多少种浏览器吗？除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外，世界上还有近百种浏览器。
几天前，浏览器家族有刚诞生了一位小王子，就是Google推出的Chrome浏览器。由于Chrome出生名门，尽管他还是个小家伙，没有人敢小看他。以后，咱们常说浏览器的“四大才子”就得改称为“五朵金花”了。
在网站前端开发中，浏览器兼容性问题本已让我们手忙脚乱，Chrome的出世不知道又要给我们添多少乱子。浏览器兼容性是前端开发框架要解决的第一个问题，要解决兼容性问题就得首先准确判断出浏览器的类型及其版本。
JavaScript是前端开发的主要语言，我们可以通过编写JavaScript程序来判断浏览器的类型及版本。JavaScript判断浏览器类型一 般有两种办法，一种是根据各种浏览器独有的属性来分辨，另一种是通过分析浏览器的userAgent属性来判断的。在许多情况下，值判断出浏览器类型之 后，还需判断浏览器版本才能处理兼容性问题，而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道。
我们先来分析一下各种浏览器的特征及其userAgent。
IE

只有IE支持创建ActiveX控件，因此她有一个其他浏览器没有的东西，就是ActiveXObject函数。只要判断window对象存在 ActiveXObject函数，就可以明确判断出当前浏览器是IE。而IE各个版本典型的userAgent如下：
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
其中，版本号是MSIE之后的数字。
 
 
 

Firefox

Firefox中的DOM元素都有一个getBoxObjectFor函数，用来获取该DOM元素的位置和大小（IE对应的中是 getBoundingClientRect函数）。这是Firefox独有的，判断它即可知道是当前浏览器是Firefox。Firefox几个版本的 userAgent大致如下：
Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12
其中，版本号是Firefox之后的数字。
Opera
Opera提供了专门的浏览器标志，就是window.opera属性。Opera典型的userAgent如下：
Opera/9.27 (Windows NT [...]]]></description>
			<content:encoded><![CDATA[<div>实例效果在下面,也可以<a href="#rn01">点击这里前往</a></div>
<div>你知道世界上有多少种浏览器吗？除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外，世界上还有近百种浏览器。</div>
<p>几天前，浏览器家族有刚诞生了一位小王子，就是Google推出的Chrome浏览器。由于Chrome出生名门，尽管他还是个小家伙，没有人敢小看他。以后，咱们常说浏览器的“四大才子”就得改称为“五朵金花”了。</p>
<p>在网站前端开发中，浏览器兼容性问题本已让我们手忙脚乱，Chrome的出世不知道又要给我们添多少乱子。浏览器兼容性是前端开发框架要解决的第一个问题，要解决兼容性问题就得首先准确判断出浏览器的类型及其版本。</p>
<p>JavaScript是前端开发的主要语言，我们可以通过编写JavaScript程序来判断浏览器的类型及版本。JavaScript判断浏览器类型一 般有两种办法，一种是根据各种浏览器独有的属性来分辨，另一种是通过分析浏览器的userAgent属性来判断的。在许多情况下，值判断出浏览器类型之 后，还需判断浏览器版本才能处理兼容性问题，而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道。</p>
<p>我们先来分析一下各种浏览器的特征及其userAgent。</p>
<p><span style="font-size: medium;"><strong>IE</strong></span><br />
<span style="font-size: medium;"><br />
</span>只有IE支持创建ActiveX控件，因此她有一个其他浏览器没有的东西，就是ActiveXObject函数。只要判断window对象存在 ActiveXObject函数，就可以明确判断出当前浏览器是IE。而IE各个版本典型的userAgent如下：</p>
<div><span style="color: #0000ff;">Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)<br />
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)<br />
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)<br />
Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)</span></div>
<div><span style="color: #0000ff;">其中，版本号是MSIE之后的数字。</span></div>
<div><span style="color: #0000ff;"> </span></div>
<div><span style="color: #0000ff;"> </span></div>
<p><span style="color: #0000ff;"> </p>
<p></span></p>
<p><span style="font-size: medium;"><strong>Firefox</strong></span><br />
<span style="font-size: medium;"><br />
</span>Firefox中的DOM元素都有一个getBoxObjectFor函数，用来获取该DOM元素的位置和大小（IE对应的中是 getBoundingClientRect函数）。这是Firefox独有的，判断它即可知道是当前浏览器是Firefox。Firefox几个版本的 userAgent大致如下：<br />
<span style="color: #0000ff;">Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1<br />
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3<br />
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12<br />
</span>其中，版本号是Firefox之后的数字。</p>
<p><strong><span style="font-size: medium;">Opera</span></strong></p>
<p>Opera提供了专门的浏览器标志，就是window.opera属性。Opera典型的userAgent如下：</p>
<div><span style="color: #0000ff;">Opera/9.27 (Windows NT 5.2; U; zh-cn)<br />
Opera/8.0 (Macintosh; PPC Mac OS X; U; en)<br />
Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0</span></div>
<div><span style="color: #0000ff;">其中，版本号是靠近Opera的数字。</span></div>
<div><span style="color: #0000ff;"> </span></div>
<div><span style="color: #0000ff;"> </span></div>
<p><span style="color: #0000ff;"> </p>
<p></span></p>
<p><span style="font-size: medium;"><span style="font-size: 14pt;"><strong>Safari</strong></span></span></p>
<p>Safari浏览器中有一个其他浏览器没有的openDatabase函数，可做为判断Safari的标志。Safari典型的userAgent如下：</p>
<div><span style="color: #0000ff;">Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13<br />
Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3</span></div>
<div><span style="color: #0000ff;">其版本号是Version之后的数字。</span></div>
<div><span style="color: #0000ff;"> </span></div>
<div><span style="color: #0000ff;"> </span></div>
<p><span style="color: #0000ff;"> </p>
<p></span></p>
<p><strong><span style="font-size: medium;">Chrome</span></strong></p>
<p>Chrome有一个MessageEvent函数，但Firefox也有。不过，好在Chrome并没有Firefox的getBoxObjectFor 函数，根据这个条件还是可以准确判断出Chrome浏览器的。目前，Chrome的userAgent是：</p>
<div><span style="color: #0000ff;">Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13</span></div>
<div><span style="color: #0000ff;">其中，版本号在Chrome只后的数字。<br />
有趣的是，Chrome的userAgent还包含了Safari的特征，也许这就是Chrome可以运行所有Apple浏览器应用的基础吧。<br />
只要了解了以上信息，我们就可以根基这些特征来判断浏览器类型及其版本了。我们会将判断的结果保存在Sys名字空间中，成为前端框架的基本标志信息，供今 后的程序来读取。如果判断出谋种浏览器，Sys名字空间将有一个该浏览器名称的属性，其值为该浏览器的版本号。例如，如果判断出IE 7.0，则Sys.ie的值为7.0；如果判断出Firefox 3.0，则Sys.firefox的值为3.0。下面是判断浏览器的代码：</span></div>
<div><span style="color: #0000ff;"> </span></div>
<div><span style="color: #0000ff;"> </span></div>
<p><span style="color: #0000ff;"> </p>
<p></span></p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"></span></div>
<p> </p>
<p><span style="color: #000000;"></p>
<div><span style="DISPLAY: none">Code</span><span style="DISPLAY: inline"> </span> </div>
<div>CODE:</div>
<div>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
var Sys = {};<br />
var ua = navigator.userAgent.toLowerCase();<br />
if (window.ActiveXObject)<br />
Sys.ie = ua.match(/msie ([\d.]+)/)[1]<br />
else if (document.getBoxObjectFor)<br />
Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1]<br />
else if (window.MessageEvent &amp;&amp; !document.getBoxObjectFor)<br />
Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1]<br />
else if (window.opera)<br />
Sys.opera = ua.match(/opera.([\d.]+)/)[1]<br />
else if (window.openDatabase)<br />
Sys.safari = ua.match(/version\/([\d.]+)/)[1];</div>
<p>//以下进行测试<br />
if(Sys.ie) document.write(&#8217;IE: &#8216;+Sys.ie);<br />
if(Sys.firefox) document.write(&#8217;Firefox: &#8216;+Sys.firefox);<br />
if(Sys.chrome) document.write(&#8217;Chrome: &#8216;+Sys.chrome);<br />
if(Sys.opera) document.write(&#8217;Opera: &#8216;+Sys.opera);<br />
if(Sys.safari) document.write(&#8217;Safari: &#8216;+Sys.safari);</p>
<p>&lt;/script&gt;</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p></span></p>
<p>我们把对IE的判断放在第一，因为IE的用户最多，其次是判断Firefox。按使用者多少的顺序来判断浏览器类型，可以提高判断效率，少做无用功。之所 以将Chrome放在第三判断，是因为我们预测Chrome很快会成为市场占有率第三的浏览器。其中，在分析浏览器版本时，用到了正则表达式来析取其中的 版本信息。<br />
如果你的JavaScript玩得很高，你还可以将前面的判断代码写成这样：</p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"></span></div>
<p> </p>
<p><span style="color: #000000;"></p>
<div><span style="DISPLAY: none">Code</span><span style="DISPLAY: inline"> </span><span style="color: #000000;"><br />
</span></div>
<div>CODE:</div>
<div>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
var Sys = {};<br />
var ua = navigator.userAgent.toLowerCase();<br />
window.ActiveXObject ? Sys.ie = ua.match(/msie ([\d.]+)/)[1] :<br />
document.getBoxObjectFor ? Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1] :<br />
window.MessageEvent &amp;&amp; !document.getBoxObjectFor ? Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1] :<br />
window.opera ? Sys.opera = ua.match(/opera.([\d.]+)/)[1] :<br />
window.openDatabase ? Sys.safari = ua.match(/version\/([\d.]+)/)[1] : 0;</div>
<p>//以下进行测试<br />
if(Sys.ie) document.write(&#8217;IE: &#8216;+Sys.ie);<br />
if(Sys.firefox) document.write(&#8217;Firefox: &#8216;+Sys.firefox);<br />
if(Sys.chrome) document.write(&#8217;Chrome: &#8216;+Sys.chrome);<br />
if(Sys.opera) document.write(&#8217;Opera: &#8216;+Sys.opera);<br />
if(Sys.safari) document.write(&#8217;Safari: &#8216;+Sys.safari);<br />
&lt;/script&gt;</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p></span></p>
<p>这样可以使JavaScript代码更精简些。当然，可读性稍差一些，就看你是重视效率还是重视可维护性了。</p>
<p>使用不同特征来判断浏览器的方法，虽然在速度上比用正则表达式分析userAgent要来的快，不过这些特征可能会随浏览器版本而变化。比如，一种浏览器 本来独有的特性取得了市场上的成功，其他浏览器也就可能跟着加入该特性，从而使该浏览器的独有特征消失，导致我们的判断失败。因此，相对比较保险的做法是 通过解析userAgent中的特征来判断浏览器类型。何况，反正判断版本信息也需要解析浏览器的userAgent的。</p>
<p>通过分析各类浏览器的userAgent信息，不难得出分辨各类浏览器及其版本的正则表达式。而且，对浏览器类型的判断和版本的判断完全可以合为一体地进行。于是，我们可以写出下面的代码：</p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"> </span></div>
<p> </p>
<div><span style="color: #000000;"></span></div>
<p> </p>
<p><span style="color: #000000;"></p>
<div><span style="color: #000000;"><span style="DISPLAY: inline"> </span></span><span style="DISPLAY: none"> </span> </div>
<div>CODE:</div>
<div>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
var Sys = {};<br />
var ua = navigator.userAgent.toLowerCase();<br />
var s;<br />
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :<br />
(s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :<br />
(s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :<br />
(s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :<br />
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;</div>
<p>//以下进行测试<br />
if (Sys.ie) document.write(&#8217;IE: &#8216; + Sys.ie);<br />
if (Sys.firefox) document.write(&#8217;Firefox: &#8216; + Sys.firefox);<br />
if (Sys.chrome) document.write(&#8217;Chrome: &#8216; + Sys.chrome);<br />
if (Sys.opera) document.write(&#8217;Opera: &#8216; + Sys.opera);<br />
if (Sys.safari) document.write(&#8217;Safari: &#8216; + Sys.safari);<br />
&lt;/script&gt;</p>
<div>
<p>CODE:</p></div>
<div>&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
var Sys = {};<br />
var ua = navigator.userAgent.toLowerCase();<br />
var s;<br />
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :<br />
(s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :<br />
(s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :<br />
(s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :<br />
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;</div>
<p>//以下进行测试<br />
if (Sys.ie) document.write(&#8217;IE: &#8216; + Sys.ie);<br />
if (Sys.firefox) document.write(&#8217;Firefox: &#8216; + Sys.firefox);<br />
if (Sys.chrome) document.write(&#8217;Chrome: &#8216; + Sys.chrome);<br />
if (Sys.opera) document.write(&#8217;Opera: &#8216; + Sys.opera);<br />
if (Sys.safari) document.write(&#8217;Safari: &#8216; + Sys.safari);<br />
&lt;/script&gt;</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p></span></p>
<p>其中，采用了“&#8230; ? &#8230; : &#8230;”这样的判断表达式来精简代码。判断条件是一条赋值语句，既完成正则表达式的匹配及结果复制，又直接作为条件判断。而随后的版本信息只需从前面的匹配结果中提取即可，这是非常高效的代码。<br />
以上的代码都是为了打造前端框架所做的预研，并在五大浏览器上测试通过。今后，判断某种浏览器只需用if(Sys.ie)或 if(Sys.firefox)等形式，而判断浏览器版本只需用if(Sys.ie == &#8216;8.0&#8242;)或if(Sys.firefox == &#8216;3.0&#8242;)等形式，表达起来还是非常优雅的。</p>
<p>前端框架项目已经启动，一切就看过程和结果了&#8230;</p>
<p> </p>
<p>另一种方法:</p>
<p>&lt;script language=&#8221;javascript&#8221;&gt;<br />
if (window.XMLHttpRequest) { //Mozilla, Safari,&#8230;IE7<br />
 alert(&#8217;Mozilla, Safari,&#8230;IE7 &#8216;);<br />
 if(!window.ActiveXObject){ // Mozilla, Safari,&#8230;<br />
  alert(&#8217;Mozilla, Safari&#8217;);<br />
 } else {<br />
  alert(&#8217;IE7&#8242;);<br />
 }<br />
} else {<br />
 alert(&#8217;IE6&#8242;);<br />
}<br />
&lt;/script&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://colee.99n9.com/javascript%e5%88%a4%e6%96%ad%e6%b5%8f%e8%a7%88%e5%99%a8%e7%b1%bb%e5%9e%8b%e5%8f%8a%e7%89%88%e6%9c%ac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
