Meilleur moyen de détecter les ordinateurs Mac OS X ou Windows avec JavaScript ou jQuery

110

J'essaye donc de déplacer un bouton «fermer» vers le côté gauche lorsque l'utilisateur est sur Mac et le côté droit lorsque l'utilisateur est sur PC. Maintenant, je le fais en examinant l'agent utilisateur, mais il peut être trop facilement usurpé pour une détection fiable du système d'exploitation. Existe-t-il un moyen infaillible de détecter si le système d'exploitation sur lequel le navigateur s'exécute est Mac OS X ou Windows? Sinon, quoi de mieux que le reniflement d'agent utilisateur?

alt
la source
20
Si l'utilisateur manipule l'agent utilisateur, n'est-ce pas son problème? Je m'inquiéterais à ce sujet quand ça vous ferait mal d'avoir un useragent invalide (par exemple, quand cela leur donne accès à quelque chose que vous ne voulez pas qu'ils aient), mais pour quelque chose comme ça, pourquoi stressez-vous? Laissez-les se tirer une balle dans le pied et faire face aux conséquences - pas de sueur dans le dos, mon pote.
Mahmoud Al-Qudsi
Eh bien, plus comme une astuce qu'une réponse. Vous pouvez détecter IE avec des commentaires conditionnels. c'est +1 à l'arsenal de détection de fenêtres. mais cela échouerait si IE était exécuté dans un émulateur dans un autre système d'exploitation (comme Wine sur Linux). Au fait, qu'en est-il de Linux?
Joseph
@ MahmoudAl-Qudsi Même sans usurpation d'identité, Firefox mobile prétend souvent être Safari, Opera prétend souvent qu'il s'agit de Firefox dans certaines versions. Sans usurpation d'identité, l'agent utilisateur est encore TRÈS peu fiable.
alt
Double possible: stackoverflow.com/q/7044944/55209
Artem Koshelev
Mais la réponse à cette question n'est que des "agents utilisateurs".
alt

Réponses:

192

La propriété window.navigator.platform n'est pas usurpée lorsque la chaîne userAgent est modifiée. J'ai testé sur mon Mac si je change le userAgent pour iPhone ou Chrome Windows, navigator.platform reste MacIntel.

navigator.platform n'est pas usurpé lorsque la chaîne userAgent est modifiée

La propriété est également en lecture seule

navigator.platform est en lecture seule


Je pourrais proposer le tableau suivant

Ordinateurs Mac

Mac68K Système Macintosh 68K.
MacPPC Système Macintosh PowerPC.
MacIntel Système Intel Macintosh.

Appareils iOS

iPhone iPhone.
iPod Ipod touch.
iPad iPad.


Les macs modernes sont de retour, navigator.platform == "MacIntel"mais pour donner une "preuve future", n'utilisez pas de correspondance exacte, j'espère qu'ils changeront en quelque chose comme MacARMou MacQuantumdans le futur.

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

Pour inclure iOS qui utilise également le "côté gauche"

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


Étant donné que la plupart des systèmes d'exploitation utilisent le bouton de fermeture à droite, vous pouvez simplement déplacer le bouton de fermeture vers la gauche lorsque l'utilisateur est sur un système d'exploitation MacLike, sinon ce n'est pas un problème si vous le placez du côté le plus courant, à droite.

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
la source
3
@ Vitim.us merci beaucoup pour la réponse détaillée, vous avez vraiment sauvé ma journée :)
vivekkupadhyay
1
MacQuantum a fait ma journée. 😂
Íhor Mé
La propriété de la plateforme est en lecture seule, mais il est toujours possible de la falsifier: stackoverflow.com/questions/2166540/…
Ryan Burbidge
1
@Qix Une amélioration encore meilleure serait de remplacer str.match(regexp) ? true : falsepar regexp.test(string). La RegExp.prototype.test()méthode retourne nativement un booléen. Ainsi, mon code préféré est const platformIsMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);.
Rory O'Kane
52

C'est aussi simple que ça:

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

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

Vous pouvez faire des choses amusantes alors comme:

var isMac = isMacintosh();
var isPC = !isMacintosh();
Benny Neugebauer
la source
1
Eh bien, cela couvre deux systèmes d'exploitation. Voici une liste plus complète (mais peut-être encore incomplète), qui comprend Linux, BSD, Android, Palm, Sony Playstations, etc.: stackoverflow.com/questions/19877924/…
Michael Scheper
Si vous souhaitez couvrir plus de systèmes d'exploitation, vous devriez opter pour une bibliothèque comme Platform.js: github.com/bestiejs/platform.js
Benny Neugebauer
@BennyNeugebauer isPCne doit pas être égal à !isMacintosh();. Que faire si l'utilisateur est sous Linux ou sur toute autre plateforme différente? Il détectera qu'ils ne sont pas sur mac et pensera qu'ils sont sur PC.
Mystique
@ EternalDarkness C'est pourquoi je l'ai appelé isPC(et non isWindowsou isLinux) parce que Linux fonctionne sur des PC mais macOS ne fonctionne que sur des Mac.
Benny Neugebauer
5

Est-ce ce que vous recherchez? Sinon, faites-le moi savoir et je supprimerai ce message.

Essayez ce plugin jQuery: http://archive.plugins.jquery.com/project/client-detect

Démo: http://www.stoimen.com/jquery.client.plugin/

Ceci est basé sur quirksmode BrowserDetect une enveloppe pour le plugin de détection de navigateur / os jQuery.

Pour les lecteurs assidus:
http://www.stoimen.com/blog/2009/07/16/jquery-browser-and-os-detection-plugin/
http://www.quirksmode.org/js/support.html

Et plus de code autour du plugin se trouve ici: http://www.stoimen.com/jquery.client.plugin/jquery.client.js

Tats_innit
la source
2
MEC! J'ai usurpé mon agent utilisateur et il m'a quand même détecté sur Safari pour Mac! Merci BRUV.
alt
1
@JacksonGariety Pas de soucis bruv :)) lire plus de détails ici a tout le code résiliant :) stoimen.com/jquery.client.plugin/jquery.client.js Bonne brosniaque :) bravo!
Tats_innit
@Derek hiya bruv - il utilise le plugin de navigateur quirkmode et détecte pour le navigateur / os voir ici quirksmode.org/js/detect.html et voir plus loin stoimen.com/jquery.client.plugin/jquery.client.js & quirksmode.org /js/support.html j'espère que cela aura du sens bruv :)
Tats_innit
Peu importe, cela semble n'utiliser que des agents utilisateurs ... ça craint un peu.
alt
1
Pas vraiment la réponse que je recherche. Est-ce même possible?
alt
0

Laissez-moi savoir si cela fonctionne. Méthode de détection d'un appareil Apple (ordinateurs Mac, iPhones, etc.) avec l'aide de StackOverflow.com :
Quelle est la liste des valeurs possibles pour navigator.platform à ce jour?

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
}
haussePhoenix1979
la source