我们部署在某些云平台或者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. Android 常用adb shell 命令(转)

    调试Android程序有时需要adb shell 命令,adb全称Android Debug Bridge ,就是起到调试桥的作用. 通过adb我们可以在Eclipse中通过DDMS来调试Androi ...

  2. QC使用常见问题

    1.如果出现/qcbin/setup_a.cab this file didn’t pass singnature checking. 请下载capicom.dll文件拷贝到c:windowssyst ...

  3. nohup不输出日志信息的方法及linux重定向

    最近使用nohup创建了一个后台进程,默认日志输出到了nohup.out文件中,程序跑起来也就没再管,过了大约一周,发现硬盘空间不够了,于是查找原因,发现这个nohup.out文件已经到了70G了,导 ...

  4. 揭开 iOS 7 之 Multipath TCP 的面纱(转)

    看到中文圈似乎讨论 iOS 7 的这个特性的还不多,于是我稍微研究了一下这个「Mutlipath TCP」,写点心得.过程是这样的: Olivier Bonaventure 通过 Wireshark ...

  5. C++泛型编程之函数模板

    泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中, ...

  6. 在 beforeSend中设置ajax请求的Content-type

    $.ajaxSetup({        beforeSend: function (xhr, settings) {            if (settings.type == "PO ...

  7. lightoj 1076 【二分找满足条件的最左】

    #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ...

  8. U3D开发性能优化笔记(待增加版本.x)

    http://blog.csdn.net/kaitiren/article/details/45071997 此总结由自己经验及网上收集整理优化内容 包括: .代码方面: .函数使用方面: .ui注意 ...

  9. unity3d 在UGUI中制作自适应调整大小的滚动布局控件

    http://blog.csdn.net/rcfalcon/article/details/43459387 在游戏中,我们很多地方需要用到scroll content的概念:我们需要一个容器,能够指 ...

  10. 計蒜課/排澇(Edmond-Karp)

    題目鏈接: https://nanti.jisuanke.com/t/36 題意:中文題目誒~ 思路: 最大流模板題.... 關於最大流算法blog: http://www.cnblogs.com/z ...