Najlepszy sposób na wykrycie komputerów Mac OS X lub Windows z JavaScript lub jQuery

110

Próbuję więc przesunąć przycisk „zamknij” w lewą stronę, gdy użytkownik jest na komputerze Mac, a prawą, gdy jest na komputerze PC. Teraz robię to, badając klienta użytkownika, ale można go zbyt łatwo sfałszować, aby zapewnić niezawodne wykrywanie systemu operacyjnego. Czy istnieje pewny sposób na wykrycie, czy system operacyjny, w którym działa przeglądarka, to Mac OS X czy Windows? Jeśli nie, co jest lepsze niż wąchanie klienta użytkownika?

alt
źródło
20
Jeśli użytkownik manipuluje agentem użytkownika, czy to nie jest jego problem? Martwiłbym się tym, gdy boli cię to, że mają nieprawidłowy useragent (np. Gdy daje im dostęp do czegoś, czego nie chcesz, żeby mieli), ale w przypadku czegoś takiego, dlaczego się stresujesz? Niech strzelą sobie w stopę i będą musieli ponieść konsekwencje - bez potu z pleców, kolego.
Mahmoud Al-Qudsi
cóż, bardziej jak wskazówka niż odpowiedź. Możesz wykryć IE za pomocą warunkowych komentarzy. daje to +1 do arsenału wykrywania systemu Windows. ale to by się nie udało, gdyby IE został uruchomiony w emulatorze w innym systemie operacyjnym (jak Wine w Linuksie). A propos, co powiesz na Linuksa?
Joseph
@ MahmoudAl-Qudsi Nawet bez fałszowania, mobilny Firefox często udaje, że to Safari, Opera często udaje, że to Firefox w niektórych wersjach. Bez fałszowania agent użytkownika jest nadal BARDZO zawodny.
alt
Możliwy duplikat: stackoverflow.com/q/7044944/55209
Artem Koshelev
Ale odpowiedź na to pytanie to tylko „programy użytkownika”.
alt

Odpowiedzi:

192

Właściwość window.navigator.platform nie jest sfałszowana po zmianie ciągu userAgent. Testowałem na moim Macu, jeśli zmienię userAgent na iPhone'a lub Chrome Windows, navigator.platform pozostanie MacIntel.

navigator.platform nie jest sfałszowany po zmianie ciągu userAgent

Właściwość jest również tylko do odczytu

navigator.platform jest tylko do odczytu


Mógłbym wymyślić następującą tabelę

Komputery Mac

Mac68K System Macintosh 68K.
MacPPC System Macintosh PowerPC.
MacIntel System Macintosh Intel.

Urządzenia iOS

iPhone iPhone.
iPod iPod Touch.
iPad iPad.


Współczesne komputery Mac powracają, navigator.platform == "MacIntel"ale aby zapewnić „przyszłościowe zabezpieczenie”, nie używaj dokładnego dopasowania, miejmy nadzieję, że zmienią się na coś podobnego MacARMlub MacQuantumw przyszłości.

var isMac = navigator.platform.toUpperCase().indexOf('MAC')>=0;

Aby uwzględnić iOS, który również używa „lewej strony”

var isMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);
var isIOS = /(iPhone|iPod|iPad)/i.test(navigator.platform);


Ponieważ większość systemów operacyjnych używa przycisku zamykania po prawej stronie, możesz po prostu przesunąć przycisk zamykania w lewo, gdy użytkownik korzysta z systemu MacLike OS, w przeciwnym razie nie stanowi problemu, jeśli umieścisz go po najbardziej powszechnej stronie, po prawej.

setTimeout(test, 1000); //delay for demonstration

function test() {

  var mac = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);

  if (mac) {
    document.getElementById('close').classList.add("left");
  }
}
#window {
  position: absolute;
  margin: 1em;
  width: 300px;
  padding: 10px;
  border: 1px solid gray;
  background-color: #DDD;
  text-align: center;
  box-shadow: 0px 1px 3px #000;
}
#close {
  position: absolute;
  top: 0px;
  right: 0px;
  width: 22px;
  height: 22px;
  margin: -12px;
  box-shadow: 0px 1px 3px #000;
  background-color: #000;
  border: 2px solid #FFF;
  border-radius: 22px;
  color: #FFF;
  text-align: center;
  font: 14px"Comic Sans MS", Monaco;
}
#close.left{
  left: 0px;
}
<div id="window">
  <div id="close">x</div>
  <p>Hello!</p>
  <p>If the "close button" change to the left side</p>
  <p>you're on a Mac like system!</p>
</div>

http://www.nczonline.net/blog/2007/12/17/don-t-forget-navigator-platform/

Vitim.us
źródło
3
@ Vitim.us wielkie dzięki za szczegółową odpowiedź, naprawdę uratowałeś mi dzień :)
vivekkupadhyay
1
MacQuantum sprawił, że mój dzień. 😂
Íhor Mé
Właściwość platformy jest tylko do odczytu, ale nadal można ją sfałszować: stackoverflow.com/questions/2166540/…
Ryan Burbidge
1
@Qix Jeszcze lepiej poprawa byłoby wymienić str.match(regexp) ? true : falsez regexp.test(string). RegExp.prototype.test()Metoda natywnie zwraca wartość logiczną. Dlatego moim preferowanym kodem jest const platformIsMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);.
Rory O'Kane
52

To takie proste:

function isMacintosh() {
  return navigator.platform.indexOf('Mac') > -1
}

function isWindows() {
  return navigator.platform.indexOf('Win') > -1
}

Możesz wtedy robić śmieszne rzeczy, takie jak:

var isMac = isMacintosh();
var isPC = !isMacintosh();
Benny Neugebauer
źródło
1
Cóż, dotyczy to dwóch systemów operacyjnych. Oto bardziej obszerna (ale prawdopodobnie wciąż niekompletna) lista, która obejmuje Linux, BSD, Android, Palm, Sony Playstations itp .: stackoverflow.com/questions/19877924/ ...
Michael Scheper
Jeśli chcesz objąć więcej systemów operacyjnych, powinieneś wybrać bibliotekę taką jak Platform.js: github.com/bestiejs/platform.js
Benny Neugebauer
@BennyNeugebauer isPCnie powinno równać się !isMacintosh();. Co jeśli użytkownik korzysta z systemu Linux lub innej platformy? Wykryje, że nie ma ich na komputerze Mac i pomyśli, że są na komputerze.
Mistyczne
@ EternalDarkness Dlatego nazwałem to isPC(i nie isWindowslub isLinux), ponieważ Linux działa na komputerach PC, ale macOS działa tylko na komputerach Mac.
Benny Neugebauer
5

Czy tego szukasz? W przeciwnym razie daj mi znać, a usunę ten post.

Wypróbuj tę wtyczkę jQuery: http://archive.plugins.jquery.com/project/client-detect

Demo: http://www.stoimen.com/jquery.client.plugin/

Jest to oparte na quirksmode BrowserDetect a wrap dla wtyczki jQuery do wykrywania przeglądarki / systemu operacyjnego.

Dla zapalonych czytelników:
http://www.stoimen.com/blog/2009/07/16/jquery-browser-and-os-detection-plugin/
http://www.quirksmode.org/js/support.html

Więcej kodu wokół wtyczki znajduje się tutaj: http://www.stoimen.com/jquery.client.plugin/jquery.client.js

Tats_innit
źródło
2
KOLEŚ! Sfałszowałem mojego agenta użytkownika i nadal wykrywał mnie w Safari dla Maca! Dzięki BRUV.
alt
1
@JacksonGariety Nie martw się, bruv :)) przeczytaj więcej szczegółów tutaj jest cały kod :) stoimen.com/jquery.client.plugin/jquery.client.js Życzę miłego brosniac :) Pozdrawiam!
Tats_innit
@Derek hiya bruv - wykorzystuje wtyczkę quirkmode do przeglądarki i wykrywa przeglądarkę / system operacyjny, patrz tutaj quirksmode.org/js/detect.html i dalej patrz stoimen.com/jquery.client.plugin/jquery.client.js & quirksmode.org /js/support.html mam nadzieję, że to ma sens, bruv :)
Tats_innit
Nieważne, wygląda na to, że używa się tylko agentów użytkownika ... to trochę do bani.
alt
1
Nie jest to odpowiedź, której szukam. Czy to w ogóle możliwe?
alt
0

Daj mi znać, czy to działa. Sposób wykrywania urządzenia Apple (komputery Mac, iPhone itp.) Z pomocą StackOverflow.com :
Jaka jest lista możliwych wartości dla navigator.platform na dzień dzisiejszy?

var deviceDetect = navigator.platform;
var appleDevicesArr = ['MacIntel', 'MacPPC', 'Mac68K', 'Macintosh', 'iPhone', 
'iPod', 'iPad', 'iPhone Simulator', 'iPod Simulator', 'iPad Simulator', 'Pike 
v7.6 release 92', 'Pike v7.8 release 517'];

// If on Apple device
if(appleDevicesArr.includes(deviceDetect)) {
    // Execute code
}
// If NOT on Apple device
else {
    // Execute code
}
wzrostPhoenix1979
źródło