Найкращий спосіб виявити комп'ютери Mac OS X або Windows за допомогою JavaScript або jQuery


110

Тому я намагаюся перемістити кнопку "закрити" вліво, коли користувач перебуває на Mac, і в праву, коли користувач знаходиться на ПК. Зараз я це роблю, вивчаючи агент користувача, але це може бути надто легко підроблено для надійного виявлення ОС. Чи є надійний спосіб виявити, чи є ОС, на якій працює браузер, Mac OS X чи Windows? Якщо ні, що краще, ніж нюхати агент-користувач?


20
Якщо користувач маніпулює корисним засобом, це не його проблема? Я б турбуватися про це , коли боляче тобі за них , щоб мати неприпустиме UserAgent (наприклад , коли він дає їм доступ до чого - то ви не хочете , щоб у них), але що - щось на зразок цього, чому ви підкреслити? Нехай вони стріляють собі в ногу і повинні боротися з наслідками - не потійте зі спини, приятелю.
Махмуд Аль-Кудсі

ну, більше, як підказка, ніж відповідь. Ви можете виявити IE за допомогою умовних коментарів. це +1 для арсеналу виявлення Windows. але це не вдасться, якщо 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 Computers

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

Пристрої iOS

iPhone iPhone.
iPod iPod Touch.
iPad iPad.


Сучасні маки повертаються, 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, інакше це не проблема, якщо поставити її на найбільш поширену сторону, праворуч.

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 дякую за детальну відповідь, ти дійсно врятував мені день :)
vivekkupadhyay


1
MacQuantum зробив мій день. 😂
Íhor Mé

Властивість платформи доступна лише для читання, але її все ж можна підробити: stackoverflow.com/questions/2166540/…
Ryan Burbidge

1
@Qix Ще кращим поліпшенням було б замінити str.match(regexp) ? true : falseна regexp.test(string). RegExp.prototype.test()Метод спочатку повертає логічне значення. Таким чином, мій кращий код const platformIsMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);.
Rory

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/…
Michael Scheper

Якщо ви хочете охопити більше операційних систем, вам слід зайти до бібліотеки на зразок Platform.js: github.com/bestiejs/platform.js
Benny Neugebauer

@BennyNeugebauer isPCне повинен дорівнювати !isMacintosh();. Що робити, якщо користувач працює на Linux або будь-якій іншій платформі? Він виявить, що вони не на Mac і подумає, що вони на ПК.
Містичне

@ 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 для браузера / os.

Для зацікавлених читачів:
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 Не хвилюйтесь, bruv :)) читайте подальші деталі, тут є весь код, що повторюється :) stoimen.com/jquery.client.plugin/jquery.client.js Приємного brosniac :) ура!
Tats_innit

@Derek hiya bruv - він використовує плагін браузера quirkmode і виявляє для браузера / os див. Тут quirksmode.org/js/detect.html і далі див. Stoimen.com/jquery.client.plugin/jquery.client.js & quirksmode.org /js/support.html сподіваюся, що це має сенс bruv :)
Tats_innit

Незважаючи на це, схоже, це просто використання користувальницьких агентів ... якесь відстійне.
alt

1
Не дуже відповідь, яку я шукаю. Чи можливо це навіть?
alt

0

Повідомте мене, якщо це працює. Спосіб виявлення пристрою Apple (комп’ютери Mac, iPhones тощо) за допомогою 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.