132

因此,当用户使用 Mac 时,我尝试将“关闭”按钮移动到左侧,而当用户使用 PC 时,我尝试将“关闭”按钮移动到右侧。现在我通过检查用户代理来做到这一点,但它很容易被欺骗而无法进行可靠的操作系统检测。是否有可靠的方法来检测运行浏览器的操作系统是 Mac OS X 还是 Windows?如果没有,有什么比用户代理嗅探更好的呢?

4

7 回答 7

222

更改 userAgent 字符串时不会欺骗window.navigator.platform属性。如果我将 userAgent 更改为 iPhone 或 Chrome Windows,我在我的 Mac 上进行了测试,navigator.platform仍然是 MacIntel。

更改 userAgent 字符串时不会欺骗 navigator.platform

该属性也是只读的

navigator.platform 是只读的


我可以想出下表

Mac 电脑

Mac68K 麦金塔 68K 系统。
MacPPC Macintosh PowerPC 系统。
MacIntel Macintosh 英特尔系统。

iOS 设备

iPhone 苹果手机。
iPod iPod 触摸。
iPad 平板电脑。


现代macs回归navigator.platform == "MacIntel",但为了提供一些“未来证明”,不要使用精确匹配,希望它们会变成类似MacARMMacQuantum将来的东西。

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);

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

var is_Mac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
var is_iPhone = navigator.platform == "iPhone";
var is_iPod = navigator.platform == "iPod";
var is_iPad = navigator.platform == "iPad";

/* Output */
var out = document.getElementById('out');
if (!is_OSX) out.innerHTML += "This NOT a Mac or an iOS Device!";
if (is_Mac) out.innerHTML += "This is a Mac Computer!\n";
if (is_iOS) out.innerHTML += "You're using an iOS Device!\n";
if (is_iPhone) out.innerHTML += "This is an iPhone!";
if (is_iPod) out.innerHTML += "This is an iPod Touch!";
if (is_iPad) out.innerHTML += "This is an iPad!";
out.innerHTML += "\nPlatform: " + navigator.platform;
<pre id="out"></pre>


由于大多数操作系统都使用右侧的关闭按钮,因此当用户使用 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/

于 2012-08-01T03:12:16.460 回答
66

就这么简单:

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

function isWindows() {
  return navigator.platform.indexOf('Win') > -1
}
于 2015-01-09T14:33:52.513 回答
6

这是你想要的?否则,请告诉我,我将删除此帖子。

试试这个 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

于 2012-05-10T05:36:08.543 回答
1

让我知道这个是否奏效。在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
}
于 2019-05-19T03:08:00.880 回答
1

为了完成:一些浏览器支持navigator.userAgentData.platform,这是一个只读属性。

console.log(navigator.userAgentData.platform);
// macOs

请注意,Navigator.platform 已弃用

于 2021-12-15T10:03:43.713 回答
1

您可以对此进行测试:

function getOS() {
  let userAgent = window.navigator.userAgent.toLowerCase(),
    macosPlatforms = /(macintosh|macintel|macppc|mac68k|macos)/i,
    windowsPlatforms = /(win32|win64|windows|wince)/i,
    iosPlatforms = /(iphone|ipad|ipod)/i,
    os = null;

  if (macosPlatforms.test(userAgent)) {
    os = "macos";
  } else if (iosPlatforms.test(userAgent)) {
    os = "ios";
  } else if (windowsPlatforms.test(userAgent)) {
    os = "windows";
  } else if (/android/.test(userAgent)) {
    os = "android";
  } else if (!os && /linux/.test(userAgent)) {
    os = "linux";
  }

  return os;
}

document.getElementById('your-os').textContent = getOS();
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
        <h1 id="your-os"></h1>
  </body>
</html>

于 2021-12-29T12:36:47.590 回答
0

我认为无论硬件架构如何,所有基于 Chrome 或 Chromium 的浏览器都将返回MacIntelmacOS 平台。

查看 Chromium 源代码以获取更多详细信息。

于 2021-12-01T14:58:10.010 回答