Detecta Windows 11, prin intermediul Javascript

0

Problema

Încerc să detecteze dacă utilizatorul este folosind Windows 11 în scopul de a servi corect binare atunci când faceți clic pe un buton de download. Am găsit Microsoft sugestie pentru modul de a face acest lucru aici. Ei sugerează utilizarea navigator.userAgentData.getHighEntropyValues funcție care returnează o promisiune care conțin versiunea platformei. Aici este codul ei sugerează:

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

Problema mea este că această funcție este asincron și returnează o promisiune în loc de a returna o valoare. Nu vreau să aibă de a converti toate din codul folosesc pentru a analiza agentii utilizator pentru fiecare platformă în asincron funcție.

La început, am crezut că mi-ar folosi așteaptă în loc de a folosi promisiunea ca aceasta:

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

Cu toate acestea, acest lucru a însemnat că mi-ar trebui pentru a face funcția care conține asincron. Și din același cod trebuie să lucreze pe browsere mai vechi care nu acceptă asincron și cei care o fac, nu pot face asta.

Există o modalitate de a detecta daca utilizatorul este folosind Windows 11 fără acest API? Sau folosind acest API, dar într-un mod care nu are nevoie de async?

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

Cel mai bun răspuns

4

Problema mea este că această funcție utilizează es6 și returnează o promisiune în loc de a returna o valoare.

Singura "ES6" (ES2015) este săgeata în funcție. Puteți să utilizați un tradițional funcție dacă nu doriți să utilizați o săgeată funcție. Promisiunea este asigurată de platforma, nu limba.

Nu vreau să aibă de a converti toate din codul folosesc pentru a analiza agentii utilizator pentru fiecare platformă în care să o async funcția.

Nu trebuie să, poți să faci ce cod ai demonstrat face: Folosi .then metoda. Da, va fi asincron (high-entropia informației este doar disponibil asincron, deoarece poate avea pentru a cere utilizatorului permisiunea), dar va funcționa în continuare pe browserele care nu acceptă async funcții (cu condiția, desigur, au suport getHighEntropyValues).

În caz contrar, va trebui să cadă pe spate de parsare navigator.userAgent și asta e de notorietate nesigure. Vei vrea ca oricum pentru agenții care nu acceptă getHighEntropyValues sau utilizatorii care refuza permisiunea, astfel încât să puteți face cele mai bune dvs. pentru meniul drop-down. Fi sigur de a oferi un drop-down (sau similare), astfel încât utilizatorul poate O) Corecta o presupunere incorectă, și B) de Download pentru a folosi mai târziu pe o altă platformă.

2021-11-23 15:45:54

Multumesc pentru raspuns. Ai dreptate că săgeata funcția fiind es6 nu este o problemă și ar putea folosi cu ușurință o moștenire stil funcție. Cred că problema pe care încerc să-adresa este că funcția este asincron (fie prin apel invers sau să aștepte) într-un loc pe care aș vrea să folosesc această informație sincron (deci nu trebuie să înlocuiască toate manipularea codul de pe fiecare platformă).
DHamrick

@DHamrick limitarea este că API este asincron, deci nu poate fi folosit sincron.
evolutionxbox

@evolutionxbox destul de corect! Există un alt API care realizează același obiectiv? Imaginind dacă utilizatorul este folosind Windows 11?
DHamrick

@DHamrick nici eu nu cred că există. stackoverflow.com/questions/9514179/... cele mai multe răspunsuri par să-l folosească
evolutionxbox

În alte limbi

Această pagină este în alte limbi

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