JavaScript 또는 jQuery를 사용하여 Mac OS X 또는 Windows 컴퓨터를 감지하는 가장 좋은 방법


110

그래서 저는 "닫기"버튼을 사용자가 Mac에있을 때는 왼쪽으로, 사용자가 PC에있을 때는 오른쪽으로 이동하려고합니다. 이제 사용자 에이전트를 검사하여 수행하고 있지만 신뢰할 수있는 OS 감지를 위해 너무 쉽게 스푸핑 될 수 있습니다. 브라우저가 실행되는 OS가 Mac OS X인지 Windows인지를 감지하는 확실한 방법이 있습니까? 그렇지 않다면 사용자 에이전트 스니핑보다 나은 것은 무엇입니까?


20
사용자가 useragent를 조작한다면 그게 문제가 아니겠습니까? 유효하지 않은 사용자 에이전트가있는 것이 (예를 들어, 원하지 않는 것에 액세스 할 수있는 경우) 상처 입힐 때 걱정 하지만, 이와 같은 경우 왜 스트레스를 받고 있습니까? 그들이 발에 총을 쏘고 그 결과를 처리해야합니다. 등에서 땀을 흘리지 마십시오.
Mahmoud Al-Qudsi

글쎄, 대답보다는 팁에 가깝다. 조건부 주석으로 IE를 감지 할 수 있습니다. 이것은 창 탐지 무기고에 +1입니다. 그러나 IE가 다른 OS (Linux의 Wine과 같은)의 에뮬레이터에서 실행되면 실패합니다. 그런데 리눅스는 어떻습니까?
Joseph

@ MahmoudAl-Qudsi 스푸핑 없이도 모바일 Firefox는 종종 Safari 인 것처럼 가장하고 Opera는 종종 일부 버전에서 Firefox 인 것처럼 가장합니다. 스푸핑이 없으면 사용자 에이전트는 여전히 매우 신뢰할 수 없습니다.
alt


그러나 그 질문의 대답은 단지 "사용자 에이전트"입니다.
alt

답변:


192

window.navigator.platform의 사용자 에이전트 문자열이 변경 될 때 속성이 스푸핑되지 않습니다. userAgent를 iPhone 또는 Chrome Windows로 변경하면 Mac에서 테스트 했는데 navigator.platform 은 MacIntel로 유지됩니다.

userAgent 문자열이 변경 될 때 navigator.platform이 스푸핑되지 않습니다.

속성도 읽기 전용입니다.

navigator.platform은 읽기 전용입니다.


나는 다음 표를 생각 해낼 수 있었다

Mac 컴퓨터

Mac68K Macintosh 68K 시스템.
MacPPC Macintosh PowerPC 시스템.
MacIntel Macintosh Intel 시스템.

iOS 기기

iPhone 아이폰.
iPod 아이팟 터치.
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);


대부분의 OS는 오른쪽에있는 닫기 버튼을 사용하기 때문에 사용자가 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/


3
Vitim.us 덕분 @ 자세한 답변에 대한 많은, 당신은 정말 내 일 : 저장
vivekkupadhyay

7
더 이상 사용되지 않습니다. developer.mozilla.org/en-US/docs/Web/API/NavigatorID/…
Vitim.us

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 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
음, 두 가지 운영 체제 를 다룹니다 . 여기에 리눅스, BSD, 안드로이드, 팜, 소니 플레이 스테이션을 포함하는보다 포괄적 인 (하지만 가능성이 여전히 불완전한) 목록이의 등 : stackoverflow.com/questions/19877924/...
마이클 Scheper

당신이 더 많은 운영 체제를 포함하고 싶은 경우에, 당신은 도서관 같이 가야 Platform.js: github.com/bestiejs/platform.js
베니 노이게 바우어

@BennyNeugebauer isPC!isMacintosh();. 사용자가 Linux 또는 기타 다른 플랫폼에있는 경우 어떻게합니까? Mac에 있지 않다는 것을 감지하고 PC에 있다고 생각합니다.
Mystical

나는 그것을라는 이유 @ EternalDarknessThat이다 isPC(그리고 isWindowsisLinux) 리눅스가 PC에서 실행하지만, 맥 OS는 맥에서 실행하기 때문이다.
Benny Neugebauer

5

이것이 당신이 찾고있는 것입니까? 그렇지 않은 경우 알려 주시면이 게시물을 제거하겠습니다.

이 jQuery 플러그인을 사용해보십시오 : http://archive.plugins.jquery.com/project/client-detect

데모 : http://www.stoimen.com/jquery.client.plugin/

이것은 jQuery 브라우저 / OS 감지 플러그인에 대한 quirksmode BrowserDetect 랩핑을 기반으로합니다.

열렬한 독자 :
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
친구! 사용자 에이전트를 스푸핑했는데 여전히 Mac 용 Safari에서 나를 감지했습니다! 감사합니다 BRUV.
alt

1
@JacksonGariety 걱정할 필요 없습니다 bruv :)) 여기에 전체 코드 레진이 있습니다. :) stoimen.com/jquery.client.plugin/jquery.client.js 좋은 친구 되세요 :) 건배!
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

이것이 작동하는지 알려주십시오. StackOverflow.com의 도움을 받아 Apple 장치 (Mac 컴퓨터, iPhone 등)를 감지하는 방법 :
오늘 현재 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.