1.浏览器能力检测

   根据浏览器不能将能力组合起来是更可取的方式。一次性检测所有相关特性,而不分别检测。

   举例

1 //确定浏览器是否支持Netscape风格的插件
2 var hasNSPlugins = !!(navigator.plugins && navigator.plugins.length)
3 
4 //确定浏览器是否具有DOM1级规定的能力
5 var hasDOM1 = !!(document.getElementById && document.createElement  && document.getElementByTagName);

 在实际开发中,应该将能力检测作为确定下一步解决方案的依据,而不是用它来判断用户使用的是什么浏览器。

2.怪癖检测

3.用户代理检测

   a.在每一次HTTP请求的过程中,用户代理字符串是作为响应首部发送的,可以通过javascript的navigator.userAgent属性访问。

   b.在服务端,通过检测用户代理字符串确定用户使用的浏览器是一种常用而且广泛接受的做法,在客户端则一般不使用,其优先级

     在能力检测和(或)怪癖检测之后。

     注:用户代理颇受争议,是因为 “电子欺骗”,所谓电子欺骗,就是指浏览器通过自己的用户代理字符串加入一些错误或者误导信息,

          来达到欺骗服务器的目的。

   c. IE8用户代理字符串中添加了引擎(trident) 的版本号:

     Mozilla/4.0 (compatible; MSIE 版本号; 操作系统; Trident/Trident 版本号)

4.用户代理字符串检测技术

        一般情况下,知道呈现引擎和最低限度的版本就足以决定正确的操作方法了。确切的知道浏览器的名字和版本号不如确切的知道它使用的是什么呈现引擎。

   编写的脚本主要检测五大呈现引擎:IE、Gecko、WebKit、KHTML和 Oprea。

        检测脚本的基本代码结构:

1 var client = function()
 2 {
 3     var engine = 
 4    {
 5        //呈现引擎
 6        ie: 0,
 7        gecko: 0,
 8        webkit: 0,
 9        khtml:  0,
10        opera: 0,
11 
12        //具体的版本号
13       ver: null
14    };
15 
16    //在此检测呈现引擎、平台 和 设备
17 
18   return
19    {
20        engine: engine
21    };
22 
23 }();

    要正确的识别呈现引擎,关键是检测顺序要正确。

    第一步,检测Opera,Opera浏览器可能完全模仿其他浏览器,而其他浏览器则不会标识为Opera。

                要识别Opera,必须得先检测window.opera 对象(Opera5+)。用以保存与浏览器相关的标识信息以及与浏览器的交互。

                在Opera 7.6+,调用version()方法可以返回一个表示浏览器版本的字符串,这是确定Opera版本号的最佳方式。

    检测代码:

1 if(window.opera)
2 {
3     engine.ver = window.opera.version();         //版本号信息
4     engine.opera = parseFloat(engine.ver);       //确定是否是Oprea浏览器
5 }

     第二步,检测WebKit,WebKit的用户代理字符串的 "AppleWebKit" 是独一无二的。
     检测代码:

1 var ua = navigator.userAgent;
 2 if(window.opera)
 3 {
 4      engine.ver = window.opera.version();
 5      engine.oprea = parseFloat(engine.ver);
 6 }
 7 else if(/AppleWebKit\/(\S+)/.test(ua))
 8 {
 9       engine.ver = RegExp["$1"];
10       engine.webkit = parseFloat(engine.ver);
11 }

      通过使用捕获组来获取版本信息,捕获组使用非空格的特殊字符 \s。用户代理字符串的版本号与下一部分的分隔符是一个空格。

     第三步,检测KHML.

1 ....
2 else if(/KHTML\/(S+)/.test(ua)|| /Konqueror\/([^;]+).test(ua))
3 {
4     engine.ver = RegExp["$1"];
5     engine.khtml = parseFloat(engine.ver);
6 }

  5.建议规范书写注释

  6.采用OOP思想

  7.字符串的拼接