Cách tốt nhất để phát hiện máy tính Mac OS X hoặc Windows bằng JavaScript hoặc jQuery


110

Vì vậy, tôi đang cố gắng di chuyển nút "đóng" sang bên trái khi người dùng sử dụng Mac và sang bên phải khi người dùng đang sử dụng PC. Bây giờ tôi đang làm điều đó bằng cách kiểm tra tác nhân người dùng, nhưng nó có thể bị giả mạo quá dễ dàng để phát hiện hệ điều hành đáng tin cậy. Có cách nào chắc chắn để phát hiện xem hệ điều hành mà trình duyệt đang chạy là Mac OS X hay Windows? Nếu không, còn gì tốt hơn việc đánh hơi tác nhân người dùng?


20
Nếu người dùng thao tác sử dụng, đó không phải là vấn đề của họ? Tôi sẽ lo lắng về điều đó khi bạn sẽ làm tổn thương bạn khi họ có một loại thuốc sử dụng không hợp lệ (ví dụ: khi nó cho phép họ truy cập vào thứ mà bạn không muốn họ có), nhưng đối với những thứ như thế này, tại sao bạn lại căng thẳng? Hãy để chúng tự bắn vào chân mình và phải giải quyết hậu quả - không biết mồ hôi rơi lưng bạn nhé bạn đời.
Mahmoud Al-Qudsi

tốt, giống như một mẹo hơn là một câu trả lời. Bạn có thể phát hiện IE với các nhận xét có điều kiện. đây là +1 đối với kho vũ khí phát hiện cửa sổ. nhưng điều này sẽ không thành công nếu IE được chạy trong một trình giả lập trong một hệ điều hành khác (như Wine trên Linux). Nhân tiện, làm thế nào về linux?
Joseph

@ MahmoudAl-Qudsi Ngay cả khi không giả mạo, Firefox di động thường giả danh đó là Safari, Opera thường giả vờ đó là firefox trong một số phiên bản. Không có giả mạo tác nhân người dùng vẫn RẤT không đáng tin cậy.
alt


Nhưng câu trả lời của câu hỏi đó chỉ là "tác nhân người dùng".
alt

Câu trả lời:


192

Các window.navigator.platform bất động sản không được giả mạo khi chuỗi UserAgent được thay đổi. Tôi đã thử nghiệm trên máy Mac của mình nếu tôi thay đổi userAgent thành iPhone hoặc Chrome Windows, thì Navigator.platform vẫn là MacIntel.

Navigator.platform không bị giả mạo khi chuỗi userAgent bị thay đổi

Thuộc tính cũng ở chế độ chỉ đọc

Navigator.platform ở chế độ chỉ đọc


Tôi có thể nghĩ ra bảng sau

Máy tính Mac

Mac68K Hệ thống Macintosh 68K.
MacPPC Hệ thống Macintosh PowerPC.
MacIntel Hệ thống Macintosh Intel.

Thiết bị iOS

iPhone điện thoại Iphone.
iPod iPod Touch.
iPad iPad.


Mac hiện đại quay trở lại navigator.platform == "MacIntel"nhưng để đưa ra một số "bằng chứng trong tương lai" không sử dụng đối sánh chính xác, hy vọng chúng sẽ thay đổi thành một cái gì đó tương tự MacARMhoặc MacQuantumtrong tương lai.

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

Để bao gồm iOS cũng sử dụng "phía bên trái"

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


Vì hầu hết các hệ điều hành sử dụng nút đóng ở bên phải, bạn chỉ có thể di chuyển nút đóng sang bên trái khi người dùng đang sử dụng MacLike OS, nếu không thì không thành vấn đề nếu bạn đặt nó ở phía phổ biến nhất, bên phải.

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 cảm ơn rất nhiều vì câu trả lời chi tiết, bạn thực sự đã cứu một ngày của tôi :)
vivekkupadhyay


1
MacQuantum đã làm nên ngày của tôi. 😂
Íhor Mé

Thuộc tính nền tảng là chỉ đọc, nhưng vẫn có thể giả mạo: stackoverflow.com/questions/2166540/…
Ryan Burbidge,

1
@Qix Một cải tiến tốt hơn nữa sẽ được thay thế str.match(regexp) ? true : falsebằng regexp.test(string). Các RegExp.prototype.test()phương pháp tự nhiên trả về một boolean. Vì vậy, mã ưu tiên của tôi là const platformIsMacLike = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);.
Rory O'Kane

52

Nó đơn giản như vậy:

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

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

Bạn có thể làm những điều vui nhộn sau đó như:

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

1
Chà, điều đó bao gồm hai hệ điều hành. Dưới đây là một toàn diện hơn (nhưng có thể vẫn chưa đầy đủ) danh sách, trong đó bao gồm Linux, BSD, Android, Palm, Sony Playstations, v.v .: stackoverflow.com/questions/19877924/...
Michael Scheper

Nếu bạn muốn bao gồm hệ điều hành nhiều hơn, thì bạn nên đi cho một thư viện như Platform.js: github.com/bestiejs/platform.js
Benny Neugebauer

@BennyNeugebauer isPCkhông được bằng !isMacintosh();. Điều gì sẽ xảy ra nếu người dùng đang sử dụng linux hoặc bất kỳ nền tảng nào khác? Nó sẽ phát hiện ra rằng họ không ở trên mac và nghĩ rằng họ đang ở trên PC.
Mystical

@ EternalDarkness Đó là lý do tại sao tôi gọi nó isPC(và không phải isWindowshoặc isLinux) vì Linux chạy trên PC nhưng macOS chỉ chạy trên Mac.
Benny Neugebauer

5

Đây có phải là những gì bạn đang tìm kiếm? Nếu không, hãy cho tôi biết và tôi sẽ xóa bài đăng này.

Hãy thử plugin jQuery này: http://archive.plugins.jquery.com/project/client-detect

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

Điều này dựa trên trình duyệt quirksmode BrowserDetect một gói cho trình duyệt jQuery / plugin phát hiện hệ điều hành.

Dành cho người đọc quan tâm:
http://www.stoimen.com/blog/2009/07/16/jquery-browser-and-os-detection-plugin/
http://www.quirksmode.org/js/support.html

Và nhiều mã khác xung quanh plugin nằm ở đây: http://www.stoimen.com/jquery.client.plugin/jquery.client.js


2
DUDE! Tôi đã giả mạo tác nhân người dùng của mình và nó vẫn phát hiện thấy tôi trên Safari dành cho Mac! Cảm ơn BRUV.
alt

1
@JacksonGariety Không phải lo lắng gì cả :)) đọc thêm chi tiết ở đây có toàn bộ mã đang được bán lại :) stoimen.com/jquery.client.plugin/jquery.client.js Chúc bạn có một cái vui vẻ nhé brosniac :) chúc mừng!
Tats_innit

@Derek hiya bruv - nó sử dụng plugin trình duyệt quirkmode và phát hiện cho trình duyệt / hệ điều hành xem tại đây quirksmode.org/js/detect.html và xem thêm tại stoimen.com/jquery.client.plugin/jquery.client.js & quirksmode.org /js/support.html hy vọng điều này có ý nghĩa Bruv :)
Tats_innit

Đừng bận tâm, điều này dường như chỉ đang sử dụng tác nhân người dùng ... thật tệ.
alt

1
Không hẳn là câu trả lời tôi đang tìm kiếm. Nó thậm chí có thể?
alt

0

Hãy cho tôi biết nếu các công trình này. Cách phát hiện thiết bị Apple (máy tính Mac, iPhone, v.v.) với sự trợ giúp từ StackOverflow.com :
Danh sách các giá trị có thể có cho Navigator.platform tính đến ngày hôm nay là gì?

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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.