首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Javascript检测Windows 11

通过Javascript检测Windows 11
EN

Stack Overflow用户
提问于 2021-11-23 15:35:59
回答 1查看 356关注 1票数 2

我正在尝试检测用户是否正在使用Windows11,以便在单击下载按钮时提供正确的二进制文件。我找到了微软关于如何做到这一点的建议,here。他们建议使用navigator.userAgentData.getHighEntropyValues函数,该函数返回包含平台版本的promise。以下是他们建议的代码:

代码语言:javascript
运行
复制
navigator.userAgentData.getHighEntropyValues(["platformVersion"])
 .then(ua => {
   if (navigator.userAgentData.platform === "Windows") {
     const majorPlatformVersion = parseInt(ua.platformVersion.split('.')[0]);
     if (majorPlatformVersion >= 13) {
       console.log("Windows 11 or later");
      }
      else if (majorPlatformVersion > 0) {
        console.log("Windows 10");
      }
      else {
        console.log("Before Windows 10");
      }
   }
   else {
     console.log("Not running on Windows");
   }
 });

我的问题是这个函数是异步的,它返回一个promise,而不是返回值。我不想把我用来为每个平台解析用户代理的所有代码都转换成一个异步函数。

起初,我认为我应该使用await,而不是像这样使用promise:

代码语言:javascript
运行
复制
let ua = await navigator.userAgentData.getHighEntropyValues(["platformVersion"])

然而,这意味着我需要使包含它的函数成为异步的。由于同样的代码需要在不支持异步的旧浏览器和支持异步的浏览器上运行,所以我不能这样做。

有没有办法检测用户是否在没有这个API的情况下使用Windows11?或者以一种不需要异步的方式使用这个API?

EN

回答 1

Stack Overflow用户

发布于 2021-11-23 15:45:54

我的问题是,这个函数使用es6并返回一个promise,而不是返回值。

唯一的"ES6“(ES2015)是箭头函数。如果您不想使用箭头函数,则可以使用传统函数。promise是由平台提供的,而不是语言。

我不想把我用来为每个平台解析用户代理的所有代码都转换成一个async函数。

您不必这样做,您可以像所示的代码那样执行以下操作:使用.then方法。是的,它将是异步的(高熵信息只有异步可用,因为它可能必须向用户请求权限),但它仍然可以在不支持async函数的浏览器上工作(当然,前提是它们支持getHighEntropyValues)。

否则,您将不得不依赖于解析navigator.userAgent,这是出了名的不可靠。无论如何,对于不支持getHighEntropyValues的代理或拒绝权限的用户,您都希望如此,因此您可以对下拉列表进行最佳猜测。确保提供一个下拉列表(或类似的下拉列表),以便用户可以A)更正错误的猜测,以及B)下载以供稍后在其他平台上使用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70083649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档