”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 通过JavaScript检测visionOS

通过JavaScript检测visionOS

发布于2024-07-30
浏览:565

Detecting visionOS by JavaScript

自 2024 年 7 月起,您可以使用以下代码来确定浏览器是否在 VisionOS 上。 (这不识别浏览器品牌;我只检查了主要浏览器。)

function isVisionOS () {
  return navigator.userAgent.includes("(Macintosh;") &&
    !!navigator.xr &&
    document.ontouchstart !== undefined;
}

分解

该函数使用 3 个条件。

1. 用户代理字符串是否包含“(Macintosh;”。

macOS、iPadOS、visionOS 上的 Safari 具有如下用户代理。

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15

通过使用以下代码,我们可以确定浏览器是否在macOS、iPadOS或visionOS上。

navigator.userAgent.includes("(Macintosh;")

2.浏览器是否支持XR。

根据 MDN 页面,Safari for macOS、iPadOS 不支持 XR。不过,visionOS 上的 Safari 支持。

您可以通过以下代码检查是否支持XR:

!!navigator.xr

到目前为止,标准 1 和 2 似乎足以识别visionOS。不过,macOS 上的 Chrome 支持 XR。所以我们需要No.3。

3、是否是触摸设备。

最后,我们可以使用以下代码排除 macOS。

document.ontouchstart !== undefined
操作系统 浏览器 用户代理 navigator.xr 触摸启用
visionOS (2.0) 苹果浏览器
visionOS (2.0) 火狐 (128.3)
Windows 11 Chrome (127.0.6533.72)
Windows 11 边缘(127.0.2651.74)
Android 12 (Pixel 6) Chrome (126.0.6478.188)
iOS (18.0) Chrome (127.0.6533.77)
iOS (18.0) 苹果浏览器
iPadOS (17.5.1) Chrome (127.0.6533.77)
iPadOS (17.5.1) 苹果浏览器
macOS (索诺玛 14.5) Chrome (126.0.6478.114)
macOS (索诺玛 14.5) 苹果浏览器
版本声明 本文转载于:https://dev.to/ku6ryo/detecting-visionos-by-javascript-1ei5?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-05-02
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-05-02
  • 在Go语言中如何简洁定义10的幂常量
    在Go语言中如何简洁定义10的幂常量
    在GO 利用浮点线文字一种简洁的方式是使用浮点文字,该方法是使用floingpoint protals。写作1E3比写作1000更有效。这是一个示例(67个没有空间的字符):的文字用于未构图的整数常数,我们可以将1000用于KB,并用KB将随后的常量乘以KB,如下所示(77个没有空格的字符):,作...
    编程 发布于2025-05-02
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-05-02
  • CSS网格容器中的子网格如何定位孙元素?
    CSS网格容器中的子网格如何定位孙元素?
    网格subgrids:将孙子放置在网格容器中的方法 display:subgrid and grid sashitance [us grid and grid senasonitance drespligification,display:subgrid允许一个网格项目成为subgrid。这种...
    编程 发布于2025-05-02
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-05-02
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-05-02
  • Go语言中空接口(interface{})的使用场景与注意事项
    Go语言中空接口(interface{})的使用场景与注意事项
    go中的空接口是无方法的接口,代表任何值,在处理未知数据类型时应使用。 1)它们为通用数据处理提供了灵活性,如FMT软件包所示。 2)由于潜在的类型安全性和性能问题的潜在丢失而谨慎使用它们,并使用逗号ok iDiom安全地主张。 在进行Go编程的世界时,您将不可避免地会遇到空的接口的概念,即插入[...
    编程 发布于2025-05-02
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-05-02
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-05-02
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-05-02
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-05-02
  • 组件指南,兄弟们。
    组件指南,兄弟们。
    VuePress 1.0发布!简单来说,它是一个基于Vue的静态网站生成器。而Vue的核心就是组件化开发。 如今,所有主流的JavaScript框架都采用组件化模式。即使在某些细节上存在差异(例如Svelte需要编译),它们都一致认同组件化开发模型。React完全基于组件,Next.js是流行的R...
    编程 发布于2025-05-02
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-05-02
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-05-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3