好東西要保留,如今看的好懵逼……@_@html
A、在瀏覽器存在差異一般須要根據不一樣的瀏覽器的能力分別編寫不一樣的代碼,一下一些經常使用的客戶端測方法android
一、能力檢測:在編寫代碼以前先檢測特定的瀏覽器的能力,例如,腳本在調用某個函數以前,可能要先檢測該函數是否存在,能力檢測沒法精確地檢測特定的瀏覽器和版本ios
二、怪癖檢測:其實是瀏覽器實現中存在的bug,早期的webkit就存在一個怪癖,即爲會在for-in循環中返回被隱藏的屬性,怪癖檢測一般涉及到運行一小段代碼,而後肯定瀏覽器是否存在某個怪癖,因爲怪癖檢測與能力檢測相比效率更低,所以應該只在某一個怪癖會干擾腳本運行的狀況下使用,怪癖檢測沒法精確特定的瀏覽器和版本web
三、用戶代理檢測:經過檢測用戶代理字符串來識別瀏覽器,用戶代理字符串中包含大量與瀏覽器有關的信息,包括瀏覽器、平臺、操做系統及瀏覽器版本。用戶代理字符串有過一段至關長的發展歷史,在此期間,瀏覽器提供商師徒經過在用戶代理字符串中添加一些欺騙性的信息,欺騙網站覺得本身的瀏覽器是另爲一個瀏覽器,用戶代理檢測須要特殊的技巧,特別是Opera會隱瞞其用戶代理字符串的狀況,即使如此,經過用戶代理字符串任然可以檢測出瀏覽器所用的呈現引擎以及所在的平臺,包括移動設備和遊戲系統chrome
B、在決定使用哪一種客戶端檢測方法時,應該優先考慮使用能力檢測,怪癖檢測是肯定應該如何處理代碼的第二選擇,而用戶代理檢測則是客戶端檢測的最後一種方案(這種方法對用戶代理字符串具備很強的依賴性)瀏覽器
貼個代碼iphone
1 /** 2 * Created by Administrator on 2017/7/19. 3 */ 4 //完整的用戶代理字符串檢測腳本 5 var client = function () { 6 7 //呈現引擎 8 var engine = { 9 ie: 0, 10 gecko: 0, 11 webkit: 0, 12 khtml: 0, 13 opera: 0, 14 //完整的版本號 15 ver: null 16 }; 17 18 19 //瀏覽器 20 var browser = { 21 //主要瀏覽器 22 ie: 0, 23 firefox: 0, 24 safari: 0, 25 konq: 0, 26 opera: 0, 27 chrome: 0, 28 //具體的版本號 29 ver: null 30 }; 31 32 33 //平臺,設備的操做系統 34 var system = { 35 win: false, 36 mac: false, 37 xll: false, 38 //移動設備 39 iphone: false, 40 ipod: false, 41 ipad: false, 42 ios: false, 43 android: false, 44 nokiaN: false, 45 winMobile: false, 46 //遊戲系統 47 will: false, 48 ps: false 49 }; 50 51 //檢測呈現引擎和瀏覽器 52 var ua = navigator.userAgent; 53 if (window.opera) { 54 engine.ver = browser.ver = window.opera.version(); 55 engine.opera = browser.opera = parseFloat(engine.ver); 56 } else if (/AppleWebKit\/(\S+)/.test(ua)) { 57 engine.ver = RegExp.$1; 58 engine.webkit = parseFloat(engine.ver); 59 //肯定是chrome仍是Safari 60 if (/Chrome\/(\S+)/.test(ua)) { 61 browser.ver = RegExp.$1; 62 browser.chrome = parseFloat(browser.ver); 63 } else { 64 //近似地肯定版本號 65 var safariVersion = 1; 66 if (engine.webkit < 100) { 67 safariVersion = 1; 68 } else if (engine.webkit < 312) { 69 safariVersion = 1.2; 70 } 71 else if (engine.webkit < 412) { 72 safariVersion = 1.3; 73 } 74 else { 75 safariVersion = 2; 76 } 77 browser.safari = browser.ver = safariVersion; 78 } 79 } else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) { 80 engine.ver = browser.ver = RegExp.$1; 81 engine.khtml = browser.konq = parseFloat(engine.ver); 82 } else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) { 83 engine.ver = RegExp.$1; 84 engine.gecko = parseFloat(engine.ver); 85 //肯定是否是firefox 86 if (/Firefox\/(\S+)/.test(ua)) { 87 browser.ver = RegExp.$1; 88 browser.firefox = parseFloat(browser.ver); 89 } 90 } else if (/MSIE ([^;]+)/.test(ua)) { 91 engine.ver = browser.ver = RegExp.$1; 92 engine.ie = browser.ie = parseFloat(engine.ver); 93 } 94 //檢測瀏覽器 95 browser.ie = engine.ie; 96 browser.opera = engine.opera; 97 98 //檢測平臺 99 var p = navigator.platform; 100 system.win = p.indexOf("Win") == 0; 101 system.mac = p.indexOf("Mac") == 0; 102 system.xll = (p == "Xll") || (p.indexOf("Linux") == 0); 103 104 //檢測Windows操做系統 105 if (system.win) { 106 if (/Win(?:dows)?([^do]{2})\s?(\d+\.\d+)?/.test(ua)) { 107 108 if (RegExp.$1 == "NT") { 109 switch (RegExp.$2) { 110 case "5.0": 111 system.win = "2000"; 112 break; 113 case "5.1": 114 system.win = "XP"; 115 break; 116 case "6.0": 117 system.win = "Vista"; 118 break; 119 case "6.1": 120 system.win = "7"; 121 break; 122 default : 123 system.win = "NT"; 124 break; 125 } 126 } else if (RegExp.$1 == "9x") { 127 system.win = "ME"; 128 } else { 129 system.win = RegExp.$1; 130 } 131 } 132 } 133 134 //移動設備 135 system.iphone = ua.indexOf("iPhone") > -1; 136 system.ipod = ua.indexOf("iPod") > -1; 137 system.ipad = ua.indexOf("iPad") > -1; 138 system.nokiaN = ua.indexOf("NokiaN") > -1; 139 //windos mobile 140 if (system.win == "CE") { 141 system.winMobile = system.win; 142 } else if (system.win == "Ph") { 143 if (/Windows Phone OS (\d+. \d)/.test(ua)) { 144 system.win = "Phone"; 145 system.winMobile = parseFloat(RegExp.$1); 146 } 147 } 148 //檢測iOS 版本 149 if (system.mac && ua.indexOf("Mobile") > -1) { 150 if (/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)) { 151 system.ios = parseFloat(RegExp.$1.replace("_", ".")); 152 } else { 153 system.ios = 2;//不能真正檢測出來,因此只能猜想 154 } 155 } 156 //檢測Android版本 157 if (/Android (\d+\. \d+)/.test(ua)) { 158 system.android = parseFloat(RegExp.$1); 159 } 160 //遊戲系統 161 system.will = ua.indexOf("Wii") > -1; 162 system.ps = /playstation/i.test(ua); 163 //返回這些對象 164 return{ 165 engine:engine, 166 browser: browser, 167 system: system 168 }; 169 170 }();