通过 Javascript 检测 Windows 11

Posted

技术标签:

【中文标题】通过 Javascript 检测 Windows 11【英文标题】:Detect Windows 11 via Javascript 【发布时间】:2022-01-02 02:36:58 【问题描述】:

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

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:

let ua = await navigator.userAgentData.getHighEntropyValues(["platformVersion"])

但是,这意味着我需要将包含它的函数设为异步。而且由于同样的代码需要在不支持异步的旧浏览器和支持异步的浏览器上运行,我不能这样做。

有没有办法检测用户是否在没有此 API 的情况下使用 Windows 11?还是以不需要异步的方式使用此 API?

【问题讨论】:

navigator.oscpu 呢? @evolutionxbox - Not recommended(并没有在我使用的类似 Chrome 的浏览器上实现,FWIW)。 【参考方案1】:

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

唯一的“ES6”(ES2015)有箭头功能。如果不想使用箭头函数,可以使用传统函数。承诺由平台而非语言提供。

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

您不必这样做,您可以执行您显示的代码所做的事情:使用.then 方法。是的,它将是异步的(高熵信息异步可用,因为它可能需要征求用户的许可),但它仍然可以在不支持 @987654324 的浏览器上工作@函数(当然前提是它们支持getHighEntropyValues)。

否则,您将不得不依赖解析 navigator.userAgent,而这是出了名的不可靠。无论如何,对于不支持getHighEntropyValues 的代理或拒绝许可的用户,您都需要这样做,因此您可以对下拉菜单进行最佳猜测。请务必提供下拉菜单(或类似内容),以便用户可以 A) 纠正错误的猜测,以及 B) 下载以供稍后在其他平台上使用。

【讨论】:

感谢您的回答。你是对的,箭头函数是 es6 不是问题,可以很容易地使用传统风格的函数。我想我要解决的问题是该函数在我想同步使用该信息的地方是异步的(无论是通过回调还是等待)(所以我不需要替换所有处理代码在每个平台上)。 @DHamrick 限制是API是异步的,所以不能同步使用。 @evolutionxbox 够公平的!是否有其他 API 可以实现相同的目标?确定用户是否使用的是 Windows 11? @DHamrick 不,我认为没有。 ***.com/questions/9514179/…大多数答案似乎都用它

以上是关于通过 Javascript 检测 Windows 11的主要内容,如果未能解决你的问题,请参考以下文章

从用户代理或 Javascript 检测 64 位或 32 位 Windows?

在 Javascript 中检测类似 Windows 或类似 Mac 的键盘

如何以编程方式检测是不是在 Windows 桌面应用程序中启用/禁用了 javascript? (网络浏览器控件)

通过 javascript 检测 ipad/iphone webview

通过 Javascript 检测 Apple Watch(例如,用户代理)

通过 Javascript / jQuery 检测 Android 手机