Il modo migliore per rilevare computer Mac OS X o Windows con JavaScript o jQuery


110

Quindi sto cercando di spostare un pulsante "chiudi" sul lato sinistro quando l'utente è su Mac e sul lato destro quando l'utente è su PC. Ora lo sto facendo esaminando l'agente utente, ma può essere falsificato troppo facilmente per un rilevamento affidabile del sistema operativo. Esiste un modo sicuro per rilevare se il sistema operativo su cui è in esecuzione il browser è Mac OS X o Windows? In caso contrario, cosa c'è di meglio dello sniffing dell'agente utente?


20
Se l'utente manipola l'agente utente, non è questo il suo problema? Mi preoccuperei su di esso quando si fa male si per loro di avere un UserAgent non valido (ad esempio, quando si dà loro l'accesso a qualcosa che non si desidera loro di avere), ma per qualcosa di simile, perché stai sottolineando? Lascia che si sparino a un piede e affronti le conseguenze: niente sudore dalla tua schiena, amico.
Mahmoud Al-Qudsi

beh, più come un suggerimento che come una risposta. Puoi rilevare IE con commenti condizionali. questo è +1 all'arsenale di rilevamento delle finestre. ma questo fallirebbe se IE venisse eseguito in un emulatore in un altro sistema operativo (come Wine su Linux). A proposito, che ne dici di Linux?
Joseph

@ MahmoudAl-Qudsi Anche senza spoofing, Firefox mobile spesso finge che sia Safari, Opera spesso finge che sia Firefox in alcune versioni. Senza spoofing, il programma utente è ancora MOLTO inaffidabile.
alt


Ma la risposta a questa domanda è solo "agenti utente".
alt

Risposte:


192

La proprietà window.navigator.platform non viene falsificata quando la stringa userAgent viene modificata. Ho provato sul mio Mac se cambio userAgent in iPhone o Chrome Windows, navigator.platform rimane MacIntel.

navigator.platform non viene falsificato quando la stringa userAgent viene modificata

La proprietà è anche di sola lettura

navigator.platform è di sola lettura


Potrei inventare la seguente tabella

Computer Mac

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

Dispositivi iOS

iPhone i phone.
iPod Ipod touch.
iPad iPad.


I mac moderni tornano, navigator.platform == "MacIntel"ma per dare una "prova futura" non usare la corrispondenza esatta, si spera che cambieranno in qualcosa di simile MacARMo MacQuantumin futuro.

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

Per includere iOS che utilizzano anche il "lato sinistro"

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


Poiché la maggior parte dei sistemi operativi utilizza il pulsante di chiusura a destra, puoi semplicemente spostare il pulsante di chiusura a sinistra quando l'utente è su un sistema operativo MacLike, altrimenti non è un problema se lo metti sul lato più comune, a destra.

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/


3
@ Vitim.us grazie mille per la risposta dettagliata, mi hai davvero salvato la giornata :)
vivekkupadhyay


1
MacQuantum ha reso la mia giornata. 😂
Íhor Mé

La proprietà della piattaforma è di sola lettura, ma è ancora possibile falsificarla: stackoverflow.com/questions/2166540/…
Ryan Burbidge

1
@Qix Un miglioramento ancora migliore sarebbe quello di sostituire str.match(regexp) ? true : falsecon regexp.test(string). Il RegExp.prototype.test()metodo restituisce in modo nativo un valore booleano. Quindi, il mio codice preferito è const platformIsMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);.
Rory O'Kane

52

E 'così semplice:

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

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

Puoi fare cose divertenti come:

var isMac = isMacintosh();
var isPC = !isMacintosh();

1
Bene, questo copre due sistemi operativi. Ecco un elenco più completo (ma forse ancora incompleto), che include Linux, BSD, Android, Palm, Sony Playstation, ecc .: stackoverflow.com/questions/19877924/…
Michael Scheper,

Se vuoi coprire più sistemi operativi, dovresti scegliere una libreria come Platform.js: github.com/bestiejs/platform.js
Benny Neugebauer

@BennyNeugebauer isPCnon dovrebbe essere uguale a !isMacintosh();. E se l'utente è su Linux o su un'altra piattaforma diversa? Rileverà che non sono su Mac e penserà che siano su PC.
Mistico

@ EternalDarknessEcco perché l'ho chiamato isPC(e non isWindowsor isLinux) perché Linux funziona su PC ma macOS funziona solo su Mac.
Benny Neugebauer

5

E 'questo quello che stai cercando? Altrimenti, fammi sapere e rimuoverò questo post.

Prova questo plugin jQuery: http://archive.plugins.jquery.com/project/client-detect

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

Questo si basa su quirksmode BrowserDetect un wrap per il plug-in di rilevamento browser / sistema operativo jQuery.

Per i lettori appassionati:
http://www.stoimen.com/blog/2009/07/16/jquery-browser-and-os-detection-plugin/
http://www.quirksmode.org/js/support.html

E altro codice attorno al plugin risiede qui: http://www.stoimen.com/jquery.client.plugin/jquery.client.js


2
TIPO! Ho falsificato il mio agente utente e mi ha comunque rilevato su Safari per Mac! Grazie BRUV.
alt

1
@JacksonGariety Nessun problema bruv :)) leggi ulteriori dettagli qui ha l'intero codice resinding :) stoimen.com/jquery.client.plugin/jquery.client.js Buona serata brosniac :) ciao!
Tats_innit

@Derek hiya bruv - utilizza il plug-in del browser quirkmode e rileva per il browser / sistema operativo vedi qui quirksmode.org/js/detect.html e inoltre vedi stoimen.com/jquery.client.plugin/jquery.client.js & quirksmode.org /js/support.html spero che abbia senso bruv :)
Tats_innit

Non importa, sembra che stia usando solo agenti utente ... che fa schifo.
alt

1
Non è proprio la risposta che sto cercando. È anche possibile?
alt

0

Fammi sapere se funziona. Modo per rilevare un dispositivo Apple (computer Mac, iPhone, ecc.) Con l'aiuto di StackOverflow.com :
qual è l'elenco dei possibili valori per navigator.platform a partire da oggi?

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.