如何用JavaScript判断前端应用运行环境(移动平台还是桌面环境)

简介: 如何用JavaScript判断前端应用运行环境(移动平台还是桌面环境)

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

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

image.png

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');
      }
}

image.png

另一个重要的字段为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

image.png

image.png

< 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>

image.png


相关文章
|
11天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
11天前
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
|
3天前
|
开发框架 JavaScript 中间件
中间件应用Koa.js(Node.js)
我们添加了两个中间件。第一个中间件记录请求的开始时间,并在下一个中间件执行完毕后计算并打印出请求的总时间。第二个中间件与之前的示例相同,它设置响应体为 "Hello World"
19 6
|
1天前
|
JavaScript 前端开发
深入了解前端框架Vue.js的响应式原理
本文将深入探讨Vue.js前端框架的核心特性之一——响应式原理。通过分析Vue.js中的数据绑定、依赖追踪和虚拟DOM等机制,读者将对Vue.js的响应式系统有更深入的理解,从而能够更好地利用Vue.js构建灵活、高效的前端应用。
|
3天前
|
JavaScript 中间件 API
中间件应用Express.js(Node.js)
我们定义了一个名为 `logger` 的中间件函数。它接受请求对象、响应对象以及下一个中间件函数作为参数。当接收到请求时,它会打印出请求的 HTTP 方法和 URL,然后调用 `next()` 函数来将控制权传递给下一个中间件或路由处理器。我们使用 `app.use()` 方法将 `logger` 中间件添加到了应用级别的中间件堆栈中,这意味着它将对所有请求生效。
12 3
|
4天前
|
JSON 前端开发 JavaScript
快照测试在前端自动化测试中的应用
在前端自动化测试中,快照测试常用于检验组件渲染与布局。
|
5天前
|
数据采集 JavaScript 数据可视化
Node.js爬虫在租房信息监测与分析中的应用
Node.js爬虫在租房信息监测与分析中的应用
|
9天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
10天前
|
JavaScript 前端开发 开发者
【Web 前端】什么是JS变量提升?
【5月更文挑战第1天】【Web 前端】什么是JS变量提升?
【Web 前端】什么是JS变量提升?
|
11天前
|
缓存 移动开发 前端开发
【专栏:HTML与CSS前端技术趋势篇】HTML与CSS在PWA(Progressive Web Apps)中的应用
【4月更文挑战第30天】PWA(Progressive Web Apps)结合现代Web技术,提供接近原生应用的体验。HTML在PWA中构建页面结构和内容,响应式设计、语义化标签、Manifest文件和离线页面的创建都离不开HTML。CSS则用于定制主题样式、实现动画效果、响应式布局和管理字体图标。两者协同工作,保证PWA在不同设备和网络环境下的快速、可靠和一致性体验。随着前端技术进步,HTML与CSS在PWA中的应用将更广泛。