我们部署在某些云平台或者Web服务器上的前端应用,既可以用PC端浏览器访问,也可以用手机上的浏览器访问。

在前端应用里,有时候我们需要根据运行环境的不同做出对应处理。比如下面这段逻辑,如果判断出应用当前是运行在手机上,则需要设置对应的viewport。

if (this.isMobile()) {

     var viewport = document.querySelector("meta[name=viewport]");

     if (viewport) {

           viewport.setAttribute('content', 'width = ' + window.innerWidth + ', height = ' + window.innerHeight + ', maximum-scale = 1.25, minimum-scale = 1.25');

      }

}

那么如何实现isMobile函数呢?

我们打开Chrome开发者工具,在console标签页输入navigator,回车,会发现这个对象包含了非常多的有用信息。

其中有个字段platform: 我如果在安装了Windows系统的电脑上使用Chrome,该值为Win32。

另一个重要的字段为userAgent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36

下面这段不到100行的JavaScript代码通过使用正则表达式处理navigator对象中的platform和userAgent字段来判断当前前端应用运行的环境,支持Windows/Linux/Macintosh三种操作系统,iOS/Android/BlackBerry/Windows Phone等移动平台。

代码如下。您也可以在我的github上找到这段代码。执行后,会弹出检测出的运行环境和版本号。

https://github.com/i042416/KnowlegeRepository/blob/master/practice/264_getOS.html

< html >

    <
script > var OS = { "WINDOWS": "win", "MACINTOSH": "mac", "LINUX": "linux", "IOS": "iOS", "ANDROID": "Android", "BLACKBERRY": "bb", "WINDOWS_PHONE": "winphone" }; var result = getOS(); alert(JSON.stringify(result)); function getOS() { var userAgent = navigator.userAgent; var platform, result; function getDesktopOS() { var pf = navigator.platform; if (pf.indexOf("Win") != -1) { // 说明当前是Windows操作系统 var rVersion = /Windows NT (d+).(d)/i; var uaResult = userAgent.match(rVersion); var sVersionStr = ""; if (uaResult[1] == "6") { if (uaResult[2] == 1) { sVersionStr = "7"; // 说明当前运行在Windows 7 中 } else if (uaResult[2] > 1) { sVersionStr = "8"; // 说明当前运行在Windows 8 中 } } else { sVersionStr = uaResult[1]; } return { "name": OS.WINDOWS, "versionStr": sVersionStr }; } else if (pf.indexOf("Mac") != -1) { return { "name": OS.MACINTOSH, "versionStr": "" }; // Macintosh操作系统 } else if (pf.indexOf("Linux") != -1) { return { "name": OS.LINUX, "versionStr": "" }; // 说明当前运行在Linux操作系统 } return null; } platform = /Windows Phone (?:OS )?([d.]*)/; // windows phone的正则表达式 result = userAgent.match(platform); if (result) { return ({ "name": OS.WINDOWS_PHONE, "versionStr": result[1] }); } // BlackBerry 10 if (userAgent.indexOf("(BB10;") > 0) { platform = /sVersion/ ([d.] + ) s / ; // BlackBerry的regular expression result = userAgent.match(platform); if (result) { return { "name": OS.BLACKBERRY, "versionStr": result[1] }; } else { return { "name": OS.BLACKBERRY, "versionStr": '10' }; } } // iOS, Android, BlackBerry 6.0+: platform = /(([a-zA-Z ]+);s(?:[U]?[;]?)([D]+)((?:[d._]*))(?:.*[)][^d]*)([d.]*)s/; result = userAgent.match(platform); if (result) { var appleDevices = /iPhone|iPad|iPod/; var bbDevices = /PlayBook|BlackBerry/; if (result[0].match(appleDevices)) { result[3] = result[3].replace(/_/g, "."); return ({ "name": OS.IOS, "versionStr": result[3] }); // iOS操作系统 } else if (result[2].match(/Android/)) { result[2] = result[2].replace(/s/g, ""); return ({ "name": OS.ANDROID, "versionStr": result[3] }); // Android操作系统 } else if (result[0].match(bbDevices)) { return ({ "name": OS.BLACKBERRY, "versionStr": result[4] }); // Blackberry } } //Android平台上的Firefox浏览器 platform = /((Android)[s]?([d][.d]*)?;.*Firefox/ [d][.d] * /; result = userAgent.match(platform); if (result) { return ({ "name": OS.ANDROID, "versionStr": result.length == 3 ? result[2] : "" }); } // Desktop return getDesktopOS(); } <
/script> <
/html>

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

如何用JavaScript判断前端应用运行环境(移动平台还是桌面环境)的更多相关文章

  1. 如何用JavaScript判断dom是否有存在某class的值?

    例如: <html class="no-js"> <head> </head> <body> </body> </ ...

  2. 如何在Linux桌面环境下自动启动程序?

    大多数Linux桌面环境有各自的图形用户界面(GUI),让用户可以配置针对特定用户的自动启动程序或服务.本文将介绍如何在各种Linux桌面环境下,自动启动某个程序的方法. AD:WOT2014:用户标 ...

  3. Linux系统VPS/服务器安装WINDOWS桌面环境可以采用的几个方法

    我们公司的几个项目需要在WINDOWS桌面类型的界面操作,哪怕仅有一个浏览器远程操作也是可以的,我们运维部门得到的任务就是需要能在已有的Linux系统的VPS.服务器环境中能够远程操作,至少需要能可以 ...

  4. CentOS 中 YUM 安装桌面环境(转)

    使用 yum groupinstall 指令很容易就能安装上图形界面的桌面系统. 1. yum 的 group 指令 yum 可以以程序组的模式来安装成套的软件包.支持的软件包可以通过, # yum ...

  5. linux入门--Linux桌面环境(桌面系统)大比拼[附带优缺点]

    早期的 Linux 系统都是不带界面的,只能通过命令来管理,比如运行程序.编辑文档.删除文件等.所以,要想熟练使用 Linux,就必须记忆很多命令. 后来随着 Windows 的普及,计算机界面变得越 ...

  6. 抗衡Win Linux全凭这些桌面环境

    2012年01月25日 元老级桌面环境KDE     Linux操作系统最早使用在服务器上,而桌面操作系统并不是Linux的重点突围.但是,近几年Linux桌面操作系统有崛起的趋势,抢夺了部分桌面操作 ...

  7. 1.10 Linux桌面环境(桌面系统)大比拼[附带优缺点

    早期的 Linux 系统都是不带界面的,只能通过命令来管理,比如运行程序.编辑文档.删除文件等.所以,要想熟练使用 Linux,就必须记忆很多命令. 后来随着 Windows 的普及,计算机界面变得越 ...

  8. 7款应用最广泛的Linux桌面环境盘点

    转载:http://top.jobbole.com/34823/ 多样性应该是 Linux 最好的特性之一,用户可以不断尝试各种喜欢和新鲜玩法与花样,并从中找出最适合自己的应用.无论你是 Linux ...

  9. CentOS7系列--10.1CentOS7中的GNOME桌面环境

    CentOS7中的桌面环境 1. 安装GNOME桌面环境 1.1. 列出所有安装套件 [root@appclient ~]# yum groups list Loaded plugins: faste ...

随机推荐

  1. K个联通块

    题意: 有一张无重边的无向图, 求有多少个边集,使得删掉边集里的边后,图里恰好有K个联通块. 解法: 考虑dp,$h(i,S)$表示有$i$个联通块,点集为$S$的图的个数,$g(S)$表示点集为S的 ...

  2. CodeForces 1111E. Tree

    题目简述:给定$n \leq 10^5$个节点的无根树,以及$q \leq 10^5$个询问.每个询问给定$k \leq 10^5$个不同的节点$a_1, a_2, \dots, a_k$,以及参数$ ...

  3. Spring-SpringMVC-Mybatis实例

    源码下载:https://pan.baidu.com/s/1kUK7qYj   提取码:3mgb 最近在学习SSM框架,先讲一下这三大框架都有什么作用. SpringMVC:  它用于web层,相当于 ...

  4. JSP页面无法识别EL表达式

    昨天一直纠结一个问题,JSP页面无法获取${user}的值,一直显示的是${user},今天解决了,原来是JSP页面无法识别EL表达式. 我的web.xml的声明如下: <!DOCTYPE we ...

  5. Junit使用注意点

    注意点 1. 使用了@BeforeClass后@Ignore将会失效

  6. ZOJ3321,ZOJ3317

    ZOJ3321 //there is at most one edge between two nodes. 因为这句话的局限性,又要满足环,那么一定是每个点度为2,然后为n节点的一个环 //#inc ...

  7. 51nod 1102 【单调栈】

    思路: 对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w; 利用单调栈就行了: #include <cstdio> #include <stack> #inc ...

  8. Codeforces Round #497 (Div. 2)B. Turn the Rectangles

    Bryce1010模板 http://codeforces.com/contest/1008/problems #include <bits/stdc++.h> using namespa ...

  9. bzoj1538 [NWERC2017]High Score

    网上的题解都很奇怪.. 经过相当长时间的思考,有了一个有效(自认为)的解法 设某一种合法分配方案完成后三个数分别变为a,b,c,其中a>=c,b>=c 此时如果让c减1,让a或b加1(设让 ...

  10. 洛谷 P2662 牛场围栏

    做法是这样的: 首先暴力把所有可能的边长搞出来..(当然<=0的不要) 排序边长+去重, 当且仅当可行边长里面有1时,任何长度都能取到,输出-1 当且仅当所有可行边长的gcd大于1时,不能取到的 ...