BOM如何判断设备类型?
目前golang学习网上已经有很多关于文章的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《BOM如何识别用户设备类型?》,也希望能帮助到大家,如果阅读完后真的对你学习文章有帮助,欢迎动动手指,评论留言并分享~
检测设备类型没有单一银弹式属性,最基础且常用的是navigator.userAgent,但其不靠谱原因包括历史兼容性伪装、Android生态碎片化、可被用户篡改及缺乏语义化能力。辅助判断设备类型的BOM属性还包括:1.window.innerWidth/innerHeight(视口尺寸)和window.screen.width/height(物理分辨率),用于区分屏幕大小;2.navigator.maxTouchPoints和'ontouchstart' in window,用于检测触摸支持;3.window.matchMedia()结合媒体查询判断布局适配;4.screen.orientation检测屏幕方向变化;5.navigator.connection提供网络状况间接判断移动设备。构建健壮的检测逻辑应采用组合拳策略:优先使用响应式设计与能力检测,其次结合UA作为补充,避免过度细化设备型号,并封装成工具函数提升维护性。
在BOM(Browser Object Model)的世界里,要检测用户的设备类型,我们通常会把目光投向navigator.userAgent
这个老伙计,辅以屏幕尺寸相关的属性,以及一些触摸事件的特征。但说实话,这活儿从来就不是一锤子买卖,更像是在玩一场猜谜游戏,需要多方印证,才能得出个八九不离十的结论。

解决方案
要判断设备类型,没有一个银弹式的属性,通常需要一个组合拳。最基础的当然是navigator.userAgent
,它是一个包含了浏览器、操作系统、设备信息等一大串字符串。我们可以通过匹配其中的关键词来初步判断,比如是否存在"Android"、"iPhone"、"iPad"、"Mobile"等。
function getDeviceTypeByUserAgent() { const ua = navigator.userAgent; if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua)) { // 进一步细分手机和平板 if (/iPad/i.test(ua) || (/Android/i.test(ua) && !/Mobile/i.test(ua))) { return 'tablet'; } return 'mobile'; } return 'desktop'; } // console.log(getDeviceTypeByUserAgent());
但光看userAgent
远远不够,这东西太容易伪装和误判了。更可靠的辅助手段是结合屏幕尺寸。window.innerWidth
和window.innerHeight
提供了浏览器视口(viewport)的实时尺寸,而window.screen.width
和window.screen.height
则反映了设备的物理屏幕分辨率。结合这些尺寸,可以更精确地判断是手机的小屏幕、平板的中等屏幕,还是桌面端的大屏幕。

function getDeviceTypeByScreenSize() { const width = window.innerWidth; // 经验值,可以根据实际项目需求调整 if (width <= 768) { // 假设小于等于768px是手机 return 'mobile'; } else if (width > 768 && width <= 1024) { // 假设768px到1024px是平板 return 'tablet'; } return 'desktop'; } // console.log(getDeviceTypeByScreenSize());
此外,触摸事件的支持也是一个强有力的信号。如果设备支持触摸,那它大概率是手机或平板。我们可以通过检查window.ontouchstart
是否存在,或者navigator.maxTouchPoints
是否大于0来判断。
function getDeviceTypeByTouchSupport() { if ('ontouchstart' in window || navigator.maxTouchPoints > 0) { return 'touch-device'; } return 'non-touch-device'; } // console.log(getDeviceTypeByTouchSupport());
最终,一个比较健壮的方案会把这些方法组合起来,形成一个综合判断的逻辑。比如,优先判断触摸能力,然后结合屏幕尺寸,最后再用userAgent
做一些特定设备的补充识别。

为什么说navigator.userAgent的检测方式“不太靠谱”?
这其实是个老生常谈的问题了,navigator.userAgent
就像一个爱说谎的“老实人”。我个人在项目里没少被它坑过。它的不靠谱主要体现在几个方面:
首先是历史遗留和兼容性。很多浏览器和设备为了能在早期网站上正常显示,会故意在userAgent
里伪装成其他流行的浏览器或操作系统。比如,很多Android平板的UA里会包含“Mobile”字样,导致你把它误判为手机。更别提iPad的UA里长期以来都含有“Mac OS X”和“Safari”的字样,让人傻傻分不清。
其次是碎片化和更新滞后。特别是Android生态,设备型号和系统版本简直是天文数字,每个厂商可能都有自己的UA字符串格式。新设备、新系统发布后,UA字符串会随之变化,你的检测规则可能很快就过时了,需要不断维护更新。这就像你刚学会了一套武功,结果对手又换了新的招式,你永远在追赶。
再者是可伪装性。用户或者开发者可以通过浏览器插件、开发者工具甚至修改系统配置来轻易地改变userAgent
字符串。这意味着,即使你写了一个看似完美的UA检测逻辑,也可能被用户绕过。这让基于UA的检测变得非常脆弱,一旦用户有心,就能轻易地“骗”过你的判断。
最后,它不够语义化。你检测出来的是一串字符串,而不是一个明确的设备能力。比如,你可能想知道设备是否支持触摸,或者屏幕大小是否适合某个布局,而UA并不能直接告诉你这些。它更像是一个设备的“身份证号”,而不是一份“能力清单”。所以,很多时候我们并不是真的想知道“是不是iPhone”,而是想知道“它能不能点”、“它屏幕够不够大”。
除了User-Agent,还有哪些BOM属性可以辅助判断设备类型?
除了前面提到的window.innerWidth/innerHeight
和window.screen.width/height
,还有几个BOM属性和API能提供非常有用的辅助信息:
1. navigator.maxTouchPoints
和 ontouchstart
:
这俩是判断设备是否支持触摸的最直接方式。navigator.maxTouchPoints
返回设备支持的最大同时触摸点数,如果大于0,那它就是个触屏设备。而'ontouchstart' in window
则是检查window
对象上是否存在ontouchstart
事件属性,这在老版本浏览器中也很常用。我个人觉得,对于判断“移动设备体验”而言,触屏能力比UA字符串有用多了。
2. window.matchMedia()
:
这严格来说不是一个BOM属性,而是Web API,但它与BOM紧密结合,用于检测CSS媒体查询的状态。你可以用它来判断当前视口是否符合某个媒体查询条件,比如window.matchMedia('(max-width: 768px)')
。这比手动比较window.innerWidth
要优雅得多,也更符合响应式设计的理念。你不是在判断“是不是手机”,而是在判断“当前屏幕是不是小尺寸”。
3. window.orientation
或 screen.orientation
:
这主要用于判断设备的方向(横屏或竖屏)。虽然window.orientation
已经不推荐使用,但screen.orientation
提供了更现代的API。手机和平板通常都支持屏幕方向的动态切换,而桌面设备则不具备这个特性。这可以作为判断移动设备的另一个间接线索。不过,它的主要作用还是在处理屏幕旋转事件上。
4. navigator.connection
(Network Information API):
虽然这跟设备类型不是直接关联,但它能提供当前网络连接的信息,比如effectiveType
(2G, 3G, 4G, slow-2G等)。如果一个设备当前连接的是蜂窝网络,那它大概率是移动设备。这在某些需要根据网络状况优化体验的场景下非常有用,比如加载不同质量的图片或视频。
在实际项目中,如何构建一个相对健壮的设备类型检测逻辑?
构建一个健壮的设备检测逻辑,核心思想就是“组合拳”和“能力检测优先于UA嗅探”。我通常会这样考虑:
1. 响应式设计是基石:
很多时候,你压根不需要知道用户具体是哪种设备,你只需要知道当前屏幕大小适合哪种布局。所以,优先使用CSS媒体查询和JavaScript结合window.matchMedia()
来做布局适配。这比任何设备类型检测都来得直接和有效。如果你的目标是提供不同的UI布局,那么基于视口尺寸的响应式设计是首选。
2. 能力检测优先: 如果确实需要区分设备类型来提供不同的功能或体验(比如,触摸手势和鼠标点击事件的处理逻辑不同),那么优先检测设备的能力。
- 触摸能力:
('ontouchstart' in window || navigator.maxTouchPoints > 0)
。这是判断是否为触屏设备最靠谱的方式。如果一个设备支持触摸,那它很可能就是手机或平板。 - 视口尺寸:
window.innerWidth
结合预设的断点。这是判断大屏小屏的直观方式。
3. User-Agent作为补充和细化:
只有当以上能力检测无法满足需求时,才考虑使用navigator.userAgent
。比如,你需要针对某个特定品牌的平板做一些特殊的兼容性处理,或者区分iOS和Android设备(即使它们都是触屏小屏设备)。这时,UA解析库(比如ua-parser-js
这类成熟的库)会比自己写正则匹配更可靠,但也要注意库的更新维护。
4. 避免过度区分: 别试图去区分每一个细微的设备型号,那是个无底洞。大部分业务场景下,区分“桌面/平板/手机”或者“触屏/非触屏”就足够了。过度细化只会增加代码的复杂度和维护成本。
5. 封装成服务或工具函数: 把你的检测逻辑封装成一个可复用的函数或模块。这样可以提高代码的可维护性,避免在代码库中散落着各种零碎的检测片段。
// 一个综合判断的示例(仅为示意,实际项目会更复杂) function getComprehensiveDeviceType() { const ua = navigator.userAgent; const isTouchDevice = ('ontouchstart' in window || navigator.maxTouchPoints > 0); const screenWidth = window.innerWidth; // 优先判断触摸能力和屏幕尺寸 if (isTouchDevice) { if (screenWidth <= 768) { return 'mobile'; // 触屏小屏,大概率手机 } else if (screenWidth > 768 && screenWidth <= 1024) { return 'tablet'; // 触屏中屏,大概率平板 } else { // 触屏大屏,可能是 Surface 这类二合一设备,或者大型触摸显示器 // 此时可以结合UA进一步判断 if (/iPad/i.test(ua)) return 'tablet'; // iPad Pro 这种大屏平板 return 'desktop-touch'; // 比如一体机或带触摸屏的笔记本 } } else { // 非触屏设备,基本就是桌面端 return 'desktop'; } } // console.log(getComprehensiveDeviceType());
最终,我们的目标是为用户提供最佳的体验,而不是纠结于一个精确的设备型号标签。基于能力和尺寸的判断,往往比基于User-Agent的嗅探来得更实用、更稳定。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《BOM如何判断设备类型?》文章吧,也可关注golang学习网公众号了解相关技术文章。

- 上一篇
- SpringCloudGateway自定义过滤器实战教程

- 下一篇
- 图片水印添加教程:GD库使用详解
-
- 文章 · 前端 | 6秒前 |
- HTML设置视口标签viewport详解
- 500浏览 收藏
-
- 文章 · 前端 | 8分钟前 |
- 微任务何时执行?详解JavaScript执行机制
- 411浏览 收藏
-
- 文章 · 前端 | 10分钟前 | JavaScript AbortController Promise.race 异步超时处理 超时取消
- JavaScript异步超时处理方法
- 238浏览 收藏
-
- 文章 · 前端 | 13分钟前 | JavaScript 兼容性 异步函数 资源清理 Promise.finally
- Promise.finally用法及适用场景详解
- 270浏览 收藏
-
- 文章 · 前端 | 13分钟前 |
- JavaScriptvoid用法及作用详解
- 111浏览 收藏
-
- 文章 · 前端 | 17分钟前 |
- React数组循环渲染技巧
- 354浏览 收藏
-
- 文章 · 前端 | 17分钟前 |
- 取消JavaScriptPromise的几种方式
- 428浏览 收藏
-
- 文章 · 前端 | 21分钟前 |
- HTML中aria-current属性使用详解
- 485浏览 收藏
-
- 文章 · 前端 | 25分钟前 |
- CSS实现侧边栏滑动菜单效果
- 181浏览 收藏
-
- 文章 · 前端 | 35分钟前 |
- JavaScriptfetchAPI简介与使用方法
- 197浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- CodeWhisperer
- Amazon CodeWhisperer,一款AI代码生成工具,助您高效编写代码。支持多种语言和IDE,提供智能代码建议、安全扫描,加速开发流程。
- 14次使用
-
- 畅图AI
- 探索畅图AI:领先的AI原生图表工具,告别绘图门槛。AI智能生成思维导图、流程图等多种图表,支持多模态解析、智能转换与高效团队协作。免费试用,提升效率!
- 43次使用
-
- TextIn智能文字识别平台
- TextIn智能文字识别平台,提供OCR、文档解析及NLP技术,实现文档采集、分类、信息抽取及智能审核全流程自动化。降低90%人工审核成本,提升企业效率。
- 50次使用
-
- 简篇AI排版
- SEO 简篇 AI 排版,一款强大的 AI 图文排版工具,3 秒生成专业文章。智能排版、AI 对话优化,支持工作汇报、家校通知等数百场景。会员畅享海量素材、专属客服,多格式导出,一键分享。
- 49次使用
-
- 小墨鹰AI快排
- SEO 小墨鹰 AI 快排,新媒体运营必备!30 秒自动完成公众号图文排版,更有 AI 写作助手、图片去水印等功能。海量素材模板,一键秒刷,提升运营效率!
- 43次使用
-
- 优化用户界面体验的秘密武器:CSS开发项目经验大揭秘
- 2023-11-03 501浏览
-
- 使用微信小程序实现图片轮播特效
- 2023-11-21 501浏览
-
- 解析sessionStorage的存储能力与限制
- 2024-01-11 501浏览
-
- 探索冒泡活动对于团队合作的推动力
- 2024-01-13 501浏览
-
- UI设计中为何选择绝对定位的智慧之道
- 2024-02-03 501浏览