用 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);
我想用 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);