1. 程式人生 > >使用者代理檢測與瀏覽器Ua詳細分析

使用者代理檢測與瀏覽器Ua詳細分析

先看結論/可用程式碼

通過在JavaScript中引用以下程式碼

即可在需要的時候方便的測出使用者所用瀏覽器的使用者代理字串、瀏覽器品牌、版本、核心等資訊

var client=function(){

   var engine={    //呈現引擎
      trident:0,
      gecko:0,
      webkit:0,
      khtml:0,
      presto:0,
      ver:null     //具體的版本號
   };
   var browser={   //瀏覽器
      ie:0,
      firefox:0,
      safari:0
, konq:0, opera:0, chrome:0, ver:null //具體的版本號 }; var system={ //作業系統 win:false, mac:false, x11:false }; var ua=navigator.userAgent; if(/AppleWebKit\/(\S+)/.test(ua)){ //匹配Webkit核心瀏覽器(Chrome、Safari、新Opera) engine.ver=RegExp
["$1"]; engine.webkit=parseFloat(engine.ver); if(/OPR\/(\S+)/.test(ua)){ //確定是不是引用了Webkit核心的Opera browser.ver=RegExp["$1"]; browser.opera=parseFloat(browser.ver); }else if(/Chrome\/(\S+)/.test(ua)){ //確定是不是Chrome browser.ver=RegExp["$1"]; browser.chrome=
parseFloat(browser.ver); }else if(/Version\/(\S+)/.test(ua)){ //確定是不是高版本(3+)的Safari browser.ver=RegExp["$1"]; browser.safari=parseFloat(browser.ver); }else{ //近似地確定低版本Safafi版本號 var SafariVersion=1; if(engine.webkit<100){ SafariVersion=1; }else if(engine.webkit<312){ SafariVersion=1.2; }else if(engine.webkit<412){ SafariVersion=1.3; }else{ SafariVersion=2; } browser.safari=browser.ver=SafariVersion; } }else if(window.opera){ //只匹配擁有Presto核心的老版本Opera 5+(12.15-) engine.ver=browser.ver=window.opera.version(); engine.presto=browser.opera=parseFloat(engine.ver); }else if(/Opera[\/\s](\S+)/.test(ua)){ //匹配不支援window.opera的Opera 5-或偽裝的Opera engine.ver=browser.ver=RegExp["$1"]; engine.presto=browser.opera=parseFloat(engine.ver); }else if(/KHTML\/(\S+)/.test(ua)||/Konqueror\/([^;]+)/.test(ua)){ engine.ver=browser.ver=RegExp["$1"]; engine.khtml=browser.konq=parseFloat(engine.ver); }else if(/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){ //判斷是不是基於Gecko核心 engine.ver=RegExp["$1"]; engine.gecko=parseFloat(engine.ver); if(/Firefox\/(\S+)/.test(ua)){ //確定是不是Firefox browser.ver=RegExp["$1"]; browser.firefox=parseFloat(browser.ver); } }else if(/Trident\/([\d\.]+)/.test(ua)){ //確定是否是Trident核心的瀏覽器(IE8+) engine.ver=RegExp["$1"]; engine.trident=parseFloat(engine.ver); if(/rv\:([\d\.]+)/.test(ua)||/MSIE ([^;]+)/.test(ua)){ //匹配IE8-11+ browser.ver=RegExp["$1"]; browser.ie=parseFloat(browser.ver); } }else if(/MSIE ([^;]+)/.test(ua)){ //匹配IE6、IE7 browser.ver=RegExp["$1"]; browser.ie=parseFloat(browser.ver); engine.ver=browser.ie-4.0; //模擬IE6、IE7中的Trident值 engine.trident=parseFloat(engine.ver); } var p=navigator.platform; //判斷作業系統 system.win=p.indexOf("Win")==0; system.mac=p.indexOf("Mac")==0; system.x11=(p.indexOf("X11")==0)||(p.indexOf("Linux")==0); if(system.win){ if(/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)){ if(RegExp["$1"]=="NT"){ system.win = ({ "5.0" : "2000", "5.1" : "XP", "6.0" : "Vista", "6.1" : "7", "6.2" : "8", "6.3" : "8.1", "10" : "10" })[RegExp["$2"]] || "NT"; }else if(RegExp["$1"]=="9x"){ system.win="ME"; }else{ system.win=RegExp["$1"]; } } } return { ua:ua, //使用者瀏覽器Ua原文 engine:engine, //包含著使用者瀏覽器引擎(核心)資訊 browser:browser,//包括使用者瀏覽器品牌與版本資訊 system:system //使用者所用作業系統及版本資訊 }; }();

[2015/01/16注:以上程式碼測試並吸收了本文評論中@luobotang的建議,感謝反饋]

以上程式碼封裝了一個命名為client的函式物件

實際開發中,引用了上述程式碼後,可以如下面示例程式碼所示,靈活運用client物件中的資訊

if(client.engine.webkit){ //如果是基於Webkit核心的瀏覽器
   if(client.browser.chrome){    //若是Google Chrome瀏覽器
      //執行鍼對Chrome的程式碼
   } else if {client.browser.safari}{
      //執行鍼對Safari的程式碼
   }
} else if (client.engine.gecko){ //若是基於Cecko核心的瀏覽器
   if(client.browser.firefox){
      //執行鍼對Firefox的程式碼
   } else {
      //執行鍼對其他基於Gecko核心的瀏覽器的程式碼
   }
}

下文將會使用以下程式碼alertUa等資訊作為測試參考並提供截圖(點選截圖可放大檢視)

若您需要親測任何瀏覽器的資訊,可將以下程式碼貼上於上文第一段程式碼(client物件)後並在瀏覽器中執行

alert(client.ua);

var browserName="";             //儲存當前使用的瀏覽器品牌資訊
var browserVer=0;               //儲存當前使用的瀏覽器版本資訊
for(var i in client.browser){
   if(client.browser[i]){
      browserName=i;
      browserVer=client.browser[i];
      break;
   }
}

var useEngine="";               //儲存當前瀏覽器引擎(核心)名稱
var engineVer=0;                //儲存當前使用的瀏覽器引擎版本
for(var i in client.engine){
   if(client.engine[i]){
      useEngine=i;
      engineVer=client.engine[i];
      break;
   }
}

var useSystem="";               //儲存當前作業系統資訊
for(var i in client.system){
   if(client.system[i]){
      i== "win"?useSystem = "Windows "+client.system[i]:useSystem=i;
      break;
   }
}

alert( "當前使用的瀏覽器:"+browserName
     + "\n瀏覽器版本:"+browserVer
     + "\n瀏覽器核心:"+useEngine
     + "\n核心版本:"+engineVer
     + "\n當前作業系統:"+useSystem);

相關推薦

使用者代理檢測瀏覽器Ua詳細分析

先看結論/可用程式碼 通過在JavaScript中引用以下程式碼 即可在需要的時候方便的測出使用者所用瀏覽器的使用者代理字串、瀏覽器品牌、版本、核心等資訊 var client=function(){ var engine={ //呈現引擎 trident:0,

PHP 控制反轉依賴注入詳細分析程式碼實現

PHP有很多的設計模式,比如單例模式,訂閱模式,策略模式,工廠模式,觀察者模式,這些設計模式其實無非都是為了讓程式簡化,容易維護,模組間解耦。現在我們來講講PHP的另外一種設計模式,控制反轉/依賴注入,這兩者其實是同一個概念,只是凶不同的角度去解釋的而已。 依賴注入:是從需要實現的業務邏輯上面去

51微控制器ADD,ADDCSUBB指令詳細分析

ADD與ADDC 加法指令: 例如:執行0xfefe+0x0003由於微控制器只能處理8位資料加減法 具體操作如下: /////////////////////////////低八位加法////////////////////////////////// mov r0,#0

java動態代理實現原理詳細分析(【轉載】By--- Gonjan )

【轉載】By---    Gonjan    關於Java中的動態代理,我們首先需要了解的是一種常用的設計模式--代理模式,而對於代理,根據建立代理類的時間點,又可以分為靜態代理和動態代理。  一、代理模式  

java動態代理實現原理詳細分析(【轉載】By--- Gonjan )

sleep class 實施 div prot stack 註意 san 由於 【轉載】By--- Gonjan 關於Java中的動態代理,我們首先需要了解的是一種常用的設計模式--代理模式,而對於代理,根據創建代理類的時間點,又可以分為靜態代理和動態代理。

java動態代理實現原理詳細分析

generator result title super java args 設計 需要 edt 關於Java中的動態代理,我們首先需要了解的是一種常用的設計模式--代理模式,而對於代理,根據創建代理類的時間點,又可以分為靜態代理和動態代理。 一、代理模式 代理模式

Java內部類持有外部類的引用詳細分析解決方案

調用 lai urn star keyword inner android get sta 在Java中內部類的定義與使用一般為成員內部類與匿名內部類,他們的對象都會隱式持有外部類對象的引用,影響外部類對象的回收。 GC只會回收沒有被引用或者根集不可到達的對象(取決於GC算

java代理模式裝飾模式

對象 tro 來看 彈性 java代理 question 設計模式 ava 設計 靜態代理和裝飾者模式的區別:   先來看一下裝飾者模式的定義:裝飾者模式動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。   總結一下采用裝飾者模式是為了增強或拓

DOCTYPE 瀏覽器模式分析

方向 調用 with 最新 如果 11.11 很好 chrome intern DOCTYPE 的誕生 DOCTYPE,或者稱為 Document Type Declaration(文檔類型聲明,縮寫 DTD)。通常情況下,DOCTYPE 位於一個 HTML 文檔的最前面的

詳細分析Memcached緩存Mongodb數據庫的優點作用

io瓶頸 緩存 語句 一分鐘 SQ 維護 靈活 出了 友好 http://www.mini188.com/showtopic-1604.aspx 本文詳細講下Memcached和Mongodb一些看法,以及結合應用有什麽好處,希望看到大家的意見和補充。  Memcache

AVR燒錯熔絲到恢復的一次經驗----詳細分析解決方案

AVR燒錯熔絲到恢復的一次經驗----詳細分析與解決方案---winsu(ant,ant的筆記的blog)環境目標器件:MEGA64L燒錄軟體:PonyProg2000 (Version  2.06c Beta  Jul 27 2003)燒錄硬體:按

【原創】建立保持時間裕量詳細分析

  筆者這段時間在找工作中發現,關於時序分析的基礎概念,時序關係表示式及時序違例計算幾乎是每個IC/FPGA崗位筆試面試的必考內容。就此,從建立保持時間裕量出發,夯實基礎。本文主要是對之前轉載部落格【時序約束學習筆記1】Vivado入門與提高--第12講 時序分析中的基本概念和術語 做一些總結和個人理解。  

大資料綜合專案DocCloud之需求分析功能實現詳細(續更)

DocCloud專案需求 專案背景: 在一些大型企事業單位,工作中存在各種各樣的工作文件,技術文件,規範等等。這些文件以word,xls,ppt,wps,pdf,txt存在。在此專案之前,文件的分享主要靠單位內部人員的互相傳送。沒有一個統一的平臺對企業現存的各種文件進行統

50道SQL練習題及答案詳細分析

流傳較廣的50道SQL訓練,奮鬥了不知道多久終於寫完了。前18道題的難度依次遞增,從19題開始的後半部分算是迴圈練習和額外function的附加練習,難度恢復到普通狀態。 第9題非常難,我反正沒有寫出來,如果有寫出來了的朋友還請賜教。 這50道里面自認為應該沒有太多錯誤,而且

詳細分析ES6中letvar變數提升的區別

今天在知乎看到一篇講解let跟var的文章,我認為關於let不會變數提升問題存疑,於是乎想自己寫一篇文章結合理論實踐給各位更清晰的區別開let跟var的變數提升問題。(觀點基於我的實踐,如有錯還請大佬們指點,純屬探討)   let跟var 大部分人的第一反應肯定作用域問題,va

【騰訊優測】騰訊優測是備受客戶信賴的移動雲測試平臺,為應用、遊戲,H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不僅在線上平臺提供「全面相容測試」、「原始碼缺陷分析」、「遠端真機租用」等多種質量檢測工具

騰訊優測 騰訊優測是備受客戶信賴的移動雲測試平臺,為應用、遊戲,H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不僅在線上平臺提供「全面相容測試」、「原始碼缺陷分析」、「遠端真機租用」等多種質量檢測工具...

SQL練習題-50道SQL練習題及答案詳細分析

網上流傳較廣的50道SQL訓練,奮鬥了不知道多久終於寫完了。前18道題的難度依次遞增,從19題開始的後半部分算是迴圈練習和額外function的附加練習,難度恢復到普通狀態。第9題非常難,我反正沒有寫出來,如果有寫出來了的朋友還請賜教。這50道里面自認為應該沒有太多錯誤,而且儘可能使用了最簡單或是最直接

詳細分析java中檔案的上傳下載(servlet流行框架)

在開發過程中檔案的上傳下載很常用。這裡簡單的總結一下: 1.檔案上傳必須滿足的條件: a、 頁面表單的method必須是post 因為get傳送的資料太小了 b、 頁面表單的enctype必須是multipart/form-

Android中IPC的幾種方式詳細分析優缺點分析

Android程序間通訊(IPC:Inter-Process Communication)的幾種主要方式如下 1.使用Bundle   ----> 用於android四大元件間的程序間通訊 android的四大元件都可使用Bundle傳遞資料  所以如果要實現四大元

Java實現字串的排序組合-詳細分析實現過程

劍指Offer_24 字串的排序 2018/6/19 星期二 題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述