Лучший способ обнаружить компьютеры Mac OS X или Windows с помощью JavaScript или jQuery

110

Итак, я пытаюсь переместить кнопку «закрыть» в левую сторону, когда пользователь находится на Mac, и правую сторону, когда пользователь находится на ПК. Сейчас я делаю это, исследуя пользовательский агент, но его слишком легко подделать для надежного обнаружения ОС. Есть ли верный способ определить, является ли ОС, на которой работает браузер, Mac OS X или Windows? Если нет, что может быть лучше, чем обнюхивание пользовательского агента?

альт
источник
20
Если пользователь манипулирует агентом пользователя, разве это не его проблема? Я бы беспокоился об этом, когда вам больно, если у них есть недействительный агент пользователя (например, когда он дает им доступ к чему-то, что вы не хотите, чтобы они имели), но почему вы переживаете из-за чего-то вроде этого? Позвольте им прострелить себе ногу и разобраться с последствиями - никакой пот на вашей спине, приятель.
Махмуд Аль-Кудси
ну, больше похоже на подсказку, чем на ответ. Вы можете обнаружить IE с помощью условных комментариев. это +1 к арсеналу обнаружения окон. но это не удалось бы, если бы IE запускался в эмуляторе в другой ОС (например, Wine в Linux). Кстати, а как насчет Linux?
Джозеф
@ MahmoudAl-Qudsi Даже без спуфинга мобильный Firefox часто выдает себя за Safari, Opera часто притворяется Firefox в некоторых версиях. Без спуфинга пользовательский агент по-прежнему ОЧЕНЬ ненадежен.
alt
Возможный дубликат: stackoverflow.com/q/7044944/55209
Артем Кошелев,
Но ответ на этот вопрос - просто «пользовательские агенты».
alt

Ответы:

192

Свойство window.navigator.platform не подделывается при изменении строки userAgent. Я тестировал на своем Mac, если я меняю userAgent на iPhone или Chrome Windows, navigator.platform остается MacIntel.

navigator.platform не подделывается при изменении строки userAgent

Свойство также доступно только для чтения

navigator.platform доступен только для чтения


Я мог придумать следующую таблицу

Компьютеры Mac

Mac68K Система Macintosh 68K.
MacPPC Система Macintosh PowerPC.
MacIntel Система Macintosh Intel.

Устройства iOS

iPhone iPhone.
iPod Ipod Touch.
iPad iPad.


Современные Mac возвращаются, navigator.platform == "MacIntel"но чтобы дать некоторые «доказательства будущего», не используйте точное соответствие, надеюсь, они изменятся на что-то подобное MacARMили MacQuantumв будущем.

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

Чтобы включить iOS, также используйте "левую часть"

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


Поскольку большинство ОС используют кнопку закрытия справа, вы можете просто переместить кнопку закрытия влево, когда пользователь работает на MacLike OS, в противном случае не проблема, если вы поместите ее на наиболее распространенную сторону, справа.

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
источник
3
@ Vitim.us большое спасибо за подробный ответ, вы действительно спасли мне день :)
vivekkupadhyay
7
Это не устарело. developer.mozilla.org/en-US/docs/Web/API/NavigatorID/…
Vitim.us
1
MacQuantum сделал мой день. 😂
hor Mé
Свойство платформы доступно только для чтения, но его все еще можно подделать: stackoverflow.com/questions/2166540/…
Райан Бербидж,
1
@Qix Еще лучше было бы заменить str.match(regexp) ? true : falseна regexp.test(string). RegExp.prototype.test()Метод изначально возвращает логическое значение. Таким образом, мой предпочтительный код - const platformIsMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);.
Рори О'Кейн
52

Это так просто:

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

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

Затем вы можете делать забавные вещи, например:

var isMac = isMacintosh();
var isPC = !isMacintosh();
Бенни Нойгебауэр
источник
1
Что ж, это касается двух операционных систем. Вот более полный (но, возможно, еще неполный) список, который включает Linux, BSD, Android, Palm, Sony Playstations и т.д .: stackoverflow.com/questions/19877924/…
Майкл Шепер
Если вы хотите охватить больше операционных систем, вам следует выбрать такую ​​библиотеку Platform.js: github.com/bestiejs/platform.js
Бенни Нойгебауэр,
@BennyNeugebauer isPCне должен равняться !isMacintosh();. Что делать, если пользователь использует Linux или другую платформу? Он обнаружит, что они не на Mac, и подумает, что они на ПК.
Mystical
@ EternalDarkness, поэтому я назвал его isPC(а не isWindowsили isLinux), потому что Linux работает на ПК, а macOS работает только на Mac.
Бенни Нойгебауэр
5

Это то, что вы ищите? В противном случае дайте мне знать, и я удалю этот пост.

Попробуйте этот плагин jQuery: http://archive.plugins.jquery.com/project/client-detect

Демо: http://www.stoimen.com/jquery.client.plugin/

Это основано на quirksmode BrowserDetect, обертке для jQuery-плагина обнаружения браузера / ОС.

Для увлеченных читателей:
http://www.stoimen.com/blog/2009/07/16/jquery-browser-and-os-detection-plugin/
http://www.quirksmode.org/js/support.html

И еще код плагина находится здесь: http://www.stoimen.com/jquery.client.plugin/jquery.client.js

Татс_иннит
источник
2
Чувак! Я подделал свой пользовательский агент, но он все равно обнаружил меня в Safari для Mac! Спасибо BRUV.
alt
1
@JacksonGariety Не беспокойтесь, брув :)) прочтите подробности здесь, здесь есть весь код, переписывающий :) stoimen.com/jquery.client.plugin/jquery.client.js Удачи, братан :) ура!
Tats_innit
@Derek hiya bruv - он использует плагин для браузера quirkmode и определяет для браузера / ОС см. Здесь quirksmode.org/js/detect.html и далее см. Stoimen.com/jquery.client.plugin/jquery.client.js & quirksmode.org /js/support.html надеюсь это имеет смысл брув :)
Tats_innit
Неважно, похоже, это просто использование пользовательских агентов ... это отстой.
alt
1
Не совсем тот ответ, который я ищу. Это вообще возможно?
alt
0

Сообщите мне, работает ли это. Способ обнаружения устройства Apple (компьютеры Mac, iPhone и т. Д.) С помощью StackOverflow.com :
каков список возможных значений для navigator.platform на сегодняшний день?

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
}
ростPhoenix1979
источник