Der beste Weg, um Mac OS X- oder Windows-Computer mit JavaScript oder jQuery zu erkennen

109

Ich versuche also, eine Schaltfläche zum Schließen auf die linke Seite zu verschieben, wenn sich der Benutzer auf einem Mac befindet, und auf die rechte Seite, wenn sich der Benutzer auf einem PC befindet. Jetzt untersuche ich den Benutzeragenten, aber er kann für eine zuverlässige Betriebssystemerkennung zu leicht gefälscht werden. Gibt es eine todsichere Möglichkeit, festzustellen, ob das Betriebssystem, auf dem der Browser ausgeführt wird, Mac OS X oder Windows ist? Wenn nicht, was ist besser als das Schnüffeln von Benutzeragenten?

alt
quelle
20
Wenn der Benutzer den Benutzeragenten manipuliert, ist das nicht sein Problem? Ich würde mir darüber Sorgen machen, wenn es Ihnen weh tut, wenn sie einen ungültigen Benutzeragenten haben (z. B. wenn sie Zugriff auf etwas haben, das sie nicht haben sollen), aber warum betonen Sie bei so etwas? Lassen Sie sie sich in den Fuß schießen und müssen Sie sich mit den Folgen auseinandersetzen - kein Schweiß vom Rücken, Kumpel.
Mahmoud Al-Qudsi
Nun, eher ein Tipp als eine Antwort. Sie können IE mit bedingten Kommentaren erkennen. Dies ist +1 für das Windows-Erkennungsarsenal. Dies würde jedoch fehlschlagen, wenn der IE in einem Emulator in einem anderen Betriebssystem (wie Wine unter Linux) ausgeführt würde. Wie wäre es übrigens mit Linux?
Joseph
@ MahmoudAl-Qudsi Auch ohne Spoofing gibt Mobile Firefox oft vor, es sei Safari, Opera gibt in einigen Versionen oft vor, es sei Firefox. Ohne Spoofing ist der User Agent immer noch SEHR unzuverlässig.
Alt
Mögliches Duplikat: stackoverflow.com/q/7044944/55209
Artem
Die Antwort dieser Frage lautet jedoch nur "Benutzeragenten".
Alt

Antworten:

191

Die Eigenschaft window.navigator.platform wird nicht gefälscht, wenn die Zeichenfolge userAgent geändert wird. Ich habe auf meinem Mac getestet, ob ich den userAgent auf iPhone oder Chrome Windows ändere. Navigator.platform bleibt MacIntel.

navigator.platform wird nicht gefälscht, wenn die userAgent-Zeichenfolge geändert wird

Die Eigenschaft ist auch schreibgeschützt

navigator.platform ist schreibgeschützt


Ich könnte mir die folgende Tabelle einfallen lassen

Mac-Computer

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

iOS-Geräte

iPhone iPhone.
iPod IPod Touch.
iPad iPad.


Moderne Macs kehren zurück, navigator.platform == "MacIntel"aber um einen "Zukunftssicher" zu geben, verwenden Sie keine exakte Übereinstimmung. Hoffentlich ändern sie sich zu etwas wie MacARModer MacQuantumin Zukunft.

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

Um iOS einzuschließen, das auch die "linke Seite" verwendet

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


Da die meisten Betriebssysteme die Schaltfläche zum Schließen auf der rechten Seite verwenden, können Sie die Schaltfläche zum Schließen einfach nach links verschieben, wenn sich der Benutzer unter einem MacLike-Betriebssystem befindet. Andernfalls ist dies kein Problem, wenn Sie sie auf die häufigste Seite, rechts, stellen.

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
quelle
3
@ Vitim.us vielen Dank für die detaillierte Antwort, Sie haben meinen Tag wirklich gerettet :)
vivekkupadhyay
1
MacQuantum machte meinen Tag. 😂
Íhor Mé
Die Plattform-Eigenschaft ist schreibgeschützt, aber es ist immer noch möglich, sie zu fälschen
Ryan Burbidge
1
@Qix Eine noch bessere Verbesserung wäre zu ersetzen str.match(regexp) ? true : falsemit regexp.test(string). Die RegExp.prototype.test()Methode gibt nativ einen Booleschen Wert zurück. Daher ist mein bevorzugter Code const platformIsMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);.
Rory O'Kane
51

So einfach ist das:

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

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

Sie können dann lustige Dinge tun wie:

var isMac = isMacintosh();
var isPC = !isMacintosh();
Benny Neugebauer
quelle
1
Nun, das deckt zwei Betriebssysteme ab. Hier ist eine umfassendere (aber möglicherweise noch unvollständige) Liste, die Linux, BSD, Android, Palm, Sony Playstations usw. enthält: stackoverflow.com/questions/19877924/…
Michael Scheper
Wenn Sie mehr Betriebssysteme behandeln möchten, sollten Sie sich für eine Bibliothek entscheiden wie Platform.js: github.com/bestiejs/platform.js
Benny Neugebauer
@BennyNeugebauer isPCsollte nicht gleich sein !isMacintosh();. Was ist, wenn der Benutzer unter Linux oder einer anderen Plattform arbeitet? Es erkennt, dass sie nicht auf dem Mac sind und denkt, dass sie auf dem PC sind.
Mystisch
@ EternalDarknessDas ist der Grund, warum ich es genannt habe isPC(und nicht isWindowsoder isLinux), weil Linux auf PCs läuft, MacOS aber nur auf Macs.
Benny Neugebauer
5

Suchst du danach? Ansonsten lass es mich wissen und ich werde diesen Beitrag entfernen.

Probieren Sie dieses jQuery-Plugin aus: http://archive.plugins.jquery.com/project/client-detect

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

Dies basiert auf quirksmode BrowserDetect ein Wrap für jQuery Browser / OS-Erkennungs-Plugin.

Für begeisterte Leser:
http://www.stoimen.com/blog/2009/07/16/jquery-browser-and-os-detection-plugin/
http://www.quirksmode.org/js/support.html

Weitere Codes rund um das Plugin finden Sie hier: http://www.stoimen.com/jquery.client.plugin/jquery.client.js

Tats_innit
quelle
2
KUMPEL! Ich habe meinen Benutzeragenten gefälscht und er hat mich auf Safari für Mac immer noch erkannt! Danke BRUV.
Alt
1
@JacksonGariety Keine Sorge bruv :)) Lesen Sie weitere Details hier hat der gesamte Code zurückgesetzt :) stoimen.com/jquery.client.plugin/jquery.client.js Haben Sie einen schönen brosniac :) Prost!
Tats_innit
@Derek hiya bruv - es verwendet das Quirkmode-Browser-Plugin und erkennt für den Browser / OS siehe hier quirksmode.org/js/detect.html und weiter siehe stoimen.com/jquery.client.plugin/jquery.client.js & quirksmode.org /js/support.html hoffe, das macht Sinn bruv :)
Tats_innit
Egal, dies scheint nur Benutzeragenten zu verwenden ... das ist irgendwie scheiße.
Alt
1
Nicht wirklich die Antwort, die ich suche. Ist es überhaupt möglich?
Alt
0

Lassen Sie mich wissen, ob dies funktioniert. So erkennen Sie ein Apple-Gerät (Mac-Computer, iPhones usw.) mithilfe von StackOverflow.com :
Wie lautet die Liste der möglichen Werte für navigator.platform ab heute?

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
}
SteigendesPhoenix1979
quelle