Détecter Windows 11 via Javascript

0

La question

Je suis en train d'essayer de détecter si l'utilisateur est à l'aide de Windows 11 afin de servir la bonne binaires lorsqu'ils cliquent sur un bouton de téléchargement. J'ai trouvé de Microsoft suggestion sur la façon de le faire ici. Ils suggèrent d'utiliser l' navigator.userAgentData.getHighEntropyValues fonction qui retourne une promesse contenant la version de la plateforme. Voici le code qu'ils suggèrent:

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");
   }
 });

Mon problème est que cette fonction est asynchrone et retourne une promesse au lieu de retourner la valeur. Je ne veux pas avoir à convertir tous les code que j'ai utiliser pour analyser les agents d'utilisateur pour chaque plate-forme à une fonction async.

Au début, j'ai pensé que je pourrais utiliser attendent au lieu d'utiliser de la promesse, comme ceci:

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

Toutefois, cela signifiait que j'aurais besoin de faire la fonction qui la contient asynchrone. Et depuis ce même code doit fonctionner sur les anciens navigateurs qui ne supportent pas async et ceux qui le font, je ne peux pas le faire.

Est-il un moyen de détecter si l'utilisateur est à l'aide de Windows 11 sans cette API? Ou de l'utilisation de cette API, mais d'une manière qui ne nécessite pas async?

ecmascript-6 javascript windows-11
2021-11-23 15:35:58
1

La meilleure réponse

4

Mon problème est que cette fonction utilise es6 et retourne une promesse au lieu de retourner la valeur.

Le seul "ES6" (ES2015) il y a la flèche de la fonction. Vous pouvez utiliser une fonction traditionnelle si vous ne souhaitez pas utiliser une flèche de la fonction. La promesse est fourni par la plate-forme, pas la langue.

Je ne veux pas avoir à convertir tous les code que j'ai utiliser pour analyser les agents d'utilisateur pour chaque plate-forme pour un async fonction.

Vous n'avez pas, vous pouvez faire ce que le code que vous avez indiqué n': Utilisation de l' .then la méthode. Oui, il sera asynchrone (le haut de l'entropie de l'information est seulement disponible en mode asynchrone, car il peut être amené à demander à l'utilisateur l'autorisation), mais il faudra encore travailler sur les navigateurs qui ne prennent pas en charge async fonctions (à condition bien sûr qu'ils soutiennent getHighEntropyValues).

Sinon, vous devrez revenir sur l'analyse navigator.userAgent et c'est notoirement peu fiables. Vous aurez envie que de toute façon pour les agents qui ne prennent pas en charge getHighEntropyValues ou les utilisateurs qui refusent l'autorisation, de sorte que vous pouvez faire de votre mieux pour deviner la liste déroulante. Assurez-vous de fournir une liste déroulante (ou similaire), de sorte que l'utilisateur peut A) Corriger une mauvaise deviner, et B) les Télécharger pour les utiliser plus tard sur une autre plate-forme.

2021-11-23 15:45:54

Merci pour la réponse. Vous avez raison que la flèche de la fonction en cours d'es6 n'est pas un problème et qu'il pourrait facilement utiliser un héritage de style de fonction. Je crois que le problème que j'essaie de l'adresse, c'est que la fonction est asynchrone (en rappel ou à attendre dans un endroit que j'aimerais utiliser cette information de façon synchrone (je n'ai pas besoin de remplacer tout le code de gestion sur chaque plate-forme).
DHamrick

@DHamrick la limitation est que l'API est asynchrone, donc il ne peut pas être utilisé en mode synchrone.
evolutionxbox

@evolutionxbox juste assez! Est-il une autre API qui accomplit le même objectif? Déterminer si l'utilisateur est à l'aide de Windows 11?
DHamrick

@DHamrick non, je ne pense pas qu'il y est. stackoverflow.com/questions/9514179/... la plupart des réponses semblent l'utiliser
evolutionxbox

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................