วิธีที่ดีที่สุดในการตรวจจับคอมพิวเตอร์ Mac OS X หรือ Windows ด้วย JavaScript หรือ jQuery


111

ดังนั้นฉันจึงพยายามย้ายปุ่ม "ปิด" ไปทางด้านซ้ายเมื่อผู้ใช้ใช้ Mac และทางด้านขวาเมื่อผู้ใช้อยู่บนพีซี ตอนนี้ฉันกำลังทำโดยการตรวจสอบตัวแทนผู้ใช้ แต่อาจปลอมแปลงได้ง่ายเกินไปสำหรับการตรวจจับระบบปฏิบัติการที่เชื่อถือได้ มีวิธีที่แน่นอนในการตรวจสอบว่าระบบปฏิบัติการที่เบราว์เซอร์ใช้งานอยู่คือ Mac OS X หรือ Windows หรือไม่ ถ้าไม่มีอะไรจะดีไปกว่าการดมกลิ่นของตัวแทนผู้ใช้


20
หากผู้ใช้จัดการ useragent นั่นไม่ใช่ปัญหาของเขาหรือเธอ? ฉันจะกังวลเกี่ยวกับเรื่องนี้เมื่อคุณทำให้พวกเขามี useragent ที่ไม่ถูกต้อง (เช่นเมื่อมันทำให้พวกเขาเข้าถึงสิ่งที่คุณไม่ต้องการให้มี) แต่สำหรับเรื่องแบบนี้ทำไมคุณถึงเครียด? ปล่อยให้พวกเขายิงด้วยเท้าตัวเองและต้องรับมือกับผลที่ตามมา - อย่าให้เหงื่อออกหลังเพื่อน
Mahmoud Al-Qudsi

ดีเหมือนเคล็ดลับมากกว่าคำตอบ คุณสามารถตรวจจับ IE ด้วยความคิดเห็นแบบมีเงื่อนไข นี่คือ +1 ให้กับคลังแสงการตรวจจับของ windows แต่สิ่งนี้จะล้มเหลวหาก IE ถูกเรียกใช้ในอีมูเลเตอร์ในระบบปฏิบัติการอื่น (เช่น Wine บน Linux) แล้วลินุกซ์ล่ะ?
โจเซฟ

@ MahmoudAl-Qudsi แม้ว่าจะไม่มีการปลอมแปลง แต่ Firefox บนมือถือมักจะแสร้งทำเป็นว่าเป็น Safari แต่ Opera มักจะแสร้งทำเป็นว่าเป็น Firefox ในบางเวอร์ชัน หากไม่มีการปลอมแปลงตัวแทนผู้ใช้ก็ยังไม่น่าเชื่อถือมาก
alt

อาจซ้ำกันได้: stackoverflow.com/q/7044944/55209
Artem Koshelev

แต่คำตอบของคำถามนั้นเป็นเพียง "ตัวแทนผู้ใช้"
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 ไอพอดทัช.
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-forgettable-navigator-platform/


3
@ Vitim.us ขอบคุณมากสำหรับคำตอบโดยละเอียดคุณช่วยชีวิตฉันไว้ได้จริงๆ :)
vivekkupadhyay

7
ยังไม่เลิกใช้งาน developer.mozilla.org/en-US/docs/Web/API/NavigatorID/…
Vitim.us

1
MacQuantum ทำให้วันของฉัน 😂
ÍhorMé

คุณสมบัติของแพลตฟอร์มเป็นแบบอ่านอย่างเดียว แต่ยังสามารถปลอมแปลงได้: 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 O'Kane

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
เบนนี่ Neugebauer

@BennyNeugebauer isPCไม่ควรเท่ากับ!isMacintosh();. จะเกิดอะไรขึ้นถ้าผู้ใช้อยู่บน linux หรือแพลตฟอร์มอื่น ๆ ? มันจะตรวจพบว่าไม่ได้อยู่บน mac และคิดว่าอยู่บนพีซี
อาถรรพ์

นั่นเป็นเหตุผลที่ฉันเรียกมันว่าisPC(ไม่ใช่isWindowsหรือisLinux) เพราะ Linux ทำงานบนพีซี แต่ macOS ทำงานบน Mac เท่านั้น
Benny Neugebauer

5

นี่คือสิ่งที่คุณกำลังมองหา? มิฉะนั้นโปรดแจ้งให้เราทราบแล้วฉันจะลบโพสต์นี้

ลองใช้ปลั๊กอิน jQuery นี้: http://archive.plugins.jquery.com/project/client-detect

การสาธิต: http://www.stoimen.com/jquery.client.plugin/

สิ่งนี้ขึ้นอยู่กับ quirksmode BrowserDetect a wrap สำหรับ jQuery browser / os detection plugin

สำหรับผู้อ่านที่กระตือรือร้น:
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 :)) อ่านรายละเอียดเพิ่มเติมได้ที่นี่มีรหัสทั้งหมด resinding :) stoimen.com/jquery.client.plugin/jquery.client.js Have a nice brosniac :) ไชโย!
Tats_innit

@Derek hiya bruv - ใช้ปลั๊กอินเบราว์เซอร์ quirkmode และตรวจจับเบราว์เซอร์ / ระบบปฏิบัติการดูที่นี่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, 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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.