用 Javascript 检测 Chrome OS

Detecting Chrome OS with Javascript

我想用 Javascript 检测 Chrome OS,为此我使用 navigator.userAgent。现在,我是 运行 Chrome OS,我的导航器 userAgent 是

Mozilla/5.0 (X11; CrOS armv7l 6680.78.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.102 Safari/537.36

现在。我使用正则表达式来检查 userAgent 的样式,并编写了下面的代码。

<script>
    if ( navigator.userAgent = /^Mozilla\/\d{1}^.\d{1}^(X11; CrOS i\d{3} \d{1}^.\d{2}\d{3} ^AppleWebKit\/\d{3}^.\d{2} ^(KHTML, like Gecko) Chrome\/ \d{2}^.\d{1}^.\d{3}^.\d{2} ^Safari\/\d{3}^\d{2}/ ){
      console.log(navigator.userAgent);
    } else {
      console.log(navigator.userAgent);
    }
</script>

现在,加载此脚本时出现错误。

Uncaught SyntaxError: Invalid regular expression: /^Mozilla\/\d{1}^.\d{1}^(X11; CrOS i\d{3} \d{1}^.\d{2}\d{3} ^AppleWebKit\/\d{3}^.\d{2} ^(KHTML, like Gecko) Chrome\/ \d{2}^.\d{1}^.\d{3}^.\d{2} ^Safari\/\d{3}^\d{2}/: Unterminated group

我的代码有什么问题?

它抱怨的是您的 ( 没有匹配的 )。在正则表达式中,() 定义 捕获组 并且必须平衡。如果要匹配实际的 (),则必须使用反斜杠将其转义。

但是还有其他几个问题。例如,在表达式开头以外的任何地方使用 ^ ("beginning of input") 是没有意义的。

但我认为用户代理中没有其他任何东西 CrOS,所以也许简单地说:

if (/\bCrOS\b/.test(navigator.userAgent)) {
    // yes, it is (probably, if no one's mucked about with their user agent string)
} else {
    // No, it isn't (probably, if no one's mucked about with their user agent string)
}

\b 是 "word boundaries",所以我们不匹配单词中间的字符串。请注意,我让它区分大小写。


旁注:我发现 https://regex101.com/#javascript(我与它没有任何关联)对于调试正则表达式非常有用。

旁注 #2:如果您确实需要检测 ChromeOS,以上内容很有用,但如果它只是您需要检查的一项功能,如 , 特征检测可能是更好的方法。

这个怎么样?

var chromeOS = /(CrOS)/.test(navigator.userAgent);

因为 Chrome OS 用户代理看起来像这样:

Mozilla/5.0 (X11; CrOS i686 0.12.433) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.77 Safari/534.30

并且过滤掉"CrOS"是一个很好的解决方案。

我用这个:

这很简单,您可以避免使用正则表达式。如果需要,您可以添加更多代理。

// Detect if the OS is Windows or Chrome OS

var detectedOS;

if (window.navigator.userAgent.indexOf("Windows") != -1) {detectedOS = "Windows";}
if (window.navigator.userAgent.indexOf("CrOS") != -1) {detectedOS = "Chrome";}

alert("detectedOS: " + detectedOS);