慣性聚合 高效追讀感興趣之博客、新聞、科技資訊
閱原文 以慣性聚合開啟

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
JavaScript 侦测手机浏览器之五术
阮一峰 · 2021-09-29 · via 阮一峰的网络日志

时,前网页需知用户所乘者,乃手机浏览器抑或桌浏览器。

是文,据StackOverflow,辑JavaScript侦测手机浏览器之术五。

一、navigator.userAgent

至简之法,乃析浏览器user agent之字符串,中含设备之讯。

JS通过navigator.userAgent取此字符串,但其中含mobiandroidiphone等字,则可断为移动之器。


if (/Mobi|Android|iPhone/i.test(navigator.userAgent)) {
  // 当前设备是移动设备
}

// 另一种写法
if (
  navigator.userAgent.match(/Mobi/i) ||
  navigator.userAgent.match(/Android/i) ||
  navigator.userAgent.match(/iPhone/i)
) {
  // 当前设备是移动设备
}

此法之长,在简而便;其短,在不可恃,盖用户可易此字符串,使手机瀏覽器偽作案头瀏覽器也。

Chromium 之瀏覽器,復有navigator.userAgentData之屬性,亦具類似之效。所異者,乃將 user agent 字符串析為一對象,該對象之mobile屬性,返一真偽,示用戶是否用於移動設備。


const isMobile = navigator.userAgentData.mobile; 

然,蘋果之 Safari 瀏覽器與 Firefox 瀏覽器,皆不支此屬性,具體情況可查Caniuse 網站

復有已廢之navigator.platform屬性,諸瀏覽器皆支,故亦可用。其返一字符串,示用戶之操作系統。


if (/Android|iPhone|iPad|iPod/i.test(navigator.platform)) {
  // 当前设备是移动设备
}

二、window.screen,window.innerWidth

又一道法,以屏宽辨机否。

window.screen此物返用户之器屏信息,其width性乃屏宽(以像素计)。


if (window.screen.width < 500) {
  // 当前设备是移动设备 
}

前例中,若屏宽window.screen.width不及五百像素,则视作机。

此法之弊,若机横持,则不可辨。

又一性window.innerWidth返浏览器窗中网页可见之宽,较宜定页于异宽之式。


const getBrowserWidth = function() {
  if (window.innerWidth < 768) {
    return "xs";
  } else if (window.innerWidth < 991) {
    return "sm";
  } else if (window.innerWidth < 1199) {
    return "md";
  } else {
    return "lg";
  }
};

三、window.orientation

三者,侦测屏幕之向也。手机之屏,可随时易向(横竖),而案牍之器,不可也。

window.orientation此属性,用以得屏幕之今向,惟移设之器有此属性,案牍之器则返undefined


if (typeof window.orientation !== 'undefined') {
  // 当前设备是移动设备 
}

然,须谨记,iPhone之Safari浏览器,不支此属性。

四、触之事件

四者,手机浏览器之DOM元素,可通过ontouchstart属性,为touch事件设监听之函数。案牍之器,无此属性。


function isMobile() { 
  return ('ontouchstart' in document.documentElement); 
}

// 另一种写法
function isMobile() {
  try {
    document.createEvent("TouchEvent"); return true;
  } catch(e) {
    return false; 
  }
}

五、window.matchMedia()

终者,合CSS以辨之。

CSS以媒体查询之法,为网页定应式之式。若手机之媒体查询生效,则可认当前之器为移设。

window.matchMedia()法受CSS之媒体查询为参,辨此查询是否生效。


let isMobile = window.matchMedia("only screen and (max-width: 760px)").matches;

前例中,window.matchMedia()之参为一CSS查询,表唯对屏宽不逾700象素之器生效。其返一物,其matches为真值。若为true,则表查询生效,当前之器为手机。

除以屏宽辨之,亦可通过指针之精审之。


let isMobile = window.matchMedia("(pointer:coarse)").matches;

前例中,CSS之语句pointer:coarse者,今之设备指针不精也。盖手机不纳鼠标,惟容触控,故合此理。

者,或有设备兼支诸指针,若鼠标与触控并施。pointer:coarse者,惟辨主指针,复有any-pointer之令,以察众指针。


let isMobile = window.matchMedia("(any-pointer:coarse)").matches;

前例中,any-pointer:coarse者,凡指针中一有不精,即合所询。

六、工具之包

除前法外,亦可用人所著之工包。今荐react-device-detect,其支多级之设备察也。


import {isMobile} from 'react-device-detect';

if (isMobile) {
  // 当前设备是移动设备
}

(毕)