使用Javascript检测Chrome操作系统

时间:2015-04-15 17:44:07

标签: javascript user-agent google-chrome-os

我想用Javascript检测Chrome操作系统,我正在使用navigator.userAgent。现在,我正在运行Chrome操作系统,我的导航器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

我的代码有什么问题?

3 个答案:

答案 0 :(得分:8)

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

但还有其他一些问题。例如,将^(&#34;输入的开头&#34;)放在表达式的开头的任何地方都没有意义。

但我不认为还有其他任何内容将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是&#34;字边界&#34;所以我们不会在一个单词的中间匹配该字符串。请注意,我将其区分大小写。


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

附注2:如果您确实需要检测ChromeOS,则上述内容非常有用,但如果它只是您需要检查的功能,则为jfriend00 points out ,特征检测可能是更好的方法。

答案 1 :(得分:4)

这个怎么样?

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

因为Chrome操作系统用户代理如下所示:

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

过滤掉“CrOS”是一个很好的解决方案。

答案 2 :(得分:2)

我用这个:

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

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