【问题标题】:Detecting Chrome OS with Javascript使用 Javascript 检测 Chrome 操作系统
【发布时间】:2015-04-15 17:44:07
【问题描述】:

我想用 Javascript 检测 Chrome 操作系统,为此我使用了 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

我的代码有什么问题?

【问题讨论】:

  • 在编写更多查看用户代理的代码之前,您可能需要考虑改用feature detection。当然,只有在您描述了您尝试使用 Chrome 操作系统解决的实际问题时,我们才能帮助您进行功能检测。
  • @jfriend00 感谢您对使用特征检测的建议,我相信我稍后会使用该链接,但是对于这个 Web 应用程序,我宁愿看一下用户代理.
  • 为什么你认为用户代理检测更好?
  • @jfriend00 我认为是因为 Chrome OS 本质上只是 Chrome 浏览器。我想检测操作系统,而不是浏览器类型。如果我错了,请纠正我。
  • 在您告诉我们您为什么要尝试检测 Chrome 操作系统(例如,真正的问题在这里)之前,我们无法就使用功能检测进行有意义的对话。您是在询问您选择的特定解决方案,而不是告诉我们您要解决的真正问题,这是人们在 SO 上限制自己的常见方式。

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


【解决方案1】:

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

但还有其他几个问题。例如,除了表达式的开头之外的任何地方都有^(“输入的开头”)是没有意义的。

但我认为没有其他任何东西将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 是“单词边界”,因此我们不会匹配单词中间的那个字符串。请注意,我让它区分大小写。


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

旁注 #2:如果您确实需要检测 ChromeOS,上述内容很有用,但如果它只是您需要检查的功能,如 jfriend00 points out,则功能检测可能是更好的方式。

【讨论】:

  • 感谢您对我的问题的非常解释的回答,以及我以前从未见过的链接。这次我更喜欢使用用户代理,而不是特征检测。
【解决方案2】:

这个怎么样?

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”是一个很好的解决方案。

【讨论】:

  • g 代表什么,在你的例子中它是用来做什么的?
  • 它是一个全局修饰符,查找所有匹配项,而不仅仅是第一个匹配项。但我想它可以在这里删除,请参阅我编辑的答案。
  • 如果你要使用.test,那么使用捕获组也是没有意义的。
【解决方案3】:

我用这个:

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

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

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 2011-07-08
    • 2019-10-04
    • 2012-02-05
    • 2014-06-25
    • 2014-04-14
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多