JavaScript之如何对客户端进行检测
本文主要是针对各种客户端进行检测,使用了用户代理字符串检测技术,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | var client= function () { var engine= { // 呈现引擎 ie: 0, gecko: 0, webkit: 0, khtml: 0, opera: 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 , xll: false , // 移动设备 iphone: false , ipod: false , ipad: false , ios: false , android: false } ; // 在此检测呈现引擎,平台和设备 return { engine: engine, browser: browser, system: system } ; } (); //( )函数将参数传递来的字符串中的十六进制码转换成 ASCII 码并返回,它完成 escape( ) 函数的逆操作。 var engine=client; var browser=client; var ua=navigator.userAgent.toLowerCase(); if (ua.match(/opr/([d.]+)/) || window.opera) { var result=ua.match(/opr/([d.]+)/); engine.ver=browser.ver=result[1]; engine.opera=browser.opera=parseFloat(engine.ver); if (window.opera) { engine.ver=browser.ver=window.opera.version(); engine.opera=browser.opera=parseFloat(engine.ver); } } else if (/applewebkit/(S+)/.test(ua)) { engine.ver=RegExp[ "$1" ]; engine.webkit=parseFloat(engine.ver); // 确定是chrome还是safari /* * chrome用户代理字符串 * Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) * Chrome/42.0.2311.152 Safari/537.36 */ if (/chrome/(S+)/.test(ua)) { browser.ver=RegExp[ "$1" ]; browser.chrome=parseFloat(browser.ver); } else if (/version/(S+)/.test(ua)) { /* * safari用户代理字符串 * Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) * Version/5.1.7 Safari/534.57.2 */ browser.ver=RegExp[ "$1" ]; browser.safari=parseFloat(browser.ver); } else { //近似地确定版本号 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 (/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)) { engine.ver=RegExp[ "$1" ]; engine.gecko=parseFloat(engine.ver); /* * firefox的用户代理的字符串 * Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) * Gecko/20100101 Firefox/38.0 */ // 确定是不是firefox if (/firefox/(S+)/.test(ua)) { browser.ver=RegExp[ "$1" ]; browser.firefox=parseFloat(browser.ver); } } else if (/msie ([^; ]+)/.test(ua) || "ActiveXObject" in window) { if ( "ActiveXObject" in window) { if (/msie ([^; ]+)/.test(ua)) { engine.ver=browser.ver=RegExp[ "$1" ]; engine.ie=browser.ie=parseFloat(engine.ver); } else { if (/rv: ([^)]+))/.test(ua)) { engine.ver=browser.ver=RegExp[ "$1" ]; engine.ie=browser.ie=parseFloat(engine.ver); } } } } // 检测平台 var system=client; var platform=navigator.platform; system.win=platform.indexOf( "Win" )==0; system.mac=platform.indexOf( "Mac" )==0; system.x11=(platform.indexOf( "X11" )==0) || (platform.indexOf( "Linux" )==0); // 移动设备 system.iphone=ua.indexOf( "iphone" ) > -1; system.ipod=ua.indexOf( "ipod" ) > -1; system.ipad=ua.indexOf( "ipad" ) > -1; //检测iOS 版本 if (system.mac && ua.indexOf( "mobile" ) > -1) { if (/cpu (?: iphone)?os (d+_d+)/.test(ua)) { system.ios=parseFloat(RegExp.$1.replace( "_" , "." )); } else { system.ios=2; //不能真正检测出来,所以只能猜测 } } //检测Android 版本 if (/android (d+.d+)/.test(ua)) { system.android=parseFloat(RegExp.$1); } |
分类:
JavaScript
标签:
JavaScript
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 个人数据保全计划:从印象笔记迁移到joplin
· Vue3.5常用特性整理
· 重拾 SSH:从基础到安全加固
· 为什么UNIX使用init进程启动其他进程?