【问题标题】:How to set navigator userAgent?如何设置导航器userAgent?
【发布时间】:2013-09-23 13:45:50
【问题描述】:

好的,这是我设法进入的边缘案例。我正在新的 Tizen OS 上测试我的应用程序。我的 JS 代码有数以千计的导航检查。比如:

navigator.userAgent.toLocaleLowerCase().indexOf("android") || navigator.userAgent.toLocaleLowerCase().indexOf("iPad")

现在我的测试设备上的 Tizen OS 的 userAgent 没有这些字符串。结果,我的很多 css 和 JS 都被破坏了。我现在处于 POC 模式,不想花时间为所有这些条件添加额外的检查。有没有办法以编程方式设置 userAgent ?大致如下:

navigator.userAgent += " Tizen" //does not work.

MDN 说它是一个读写属性。我无法修改它。帮我解决这个问题。欺骗 userAgent 的另一种聪明方法或设置它的正确方法。谢谢。

【问题讨论】:

  • 这是一个非常糟糕的方法。甚至您引用的 MDN 文章也明确指出:“基于检测用户代理字符串的浏览器识别是不可靠的,不推荐使用 (...)”。特征检测更容易、更安全。另外,也许考虑使用Modernizr
  • 顺便说一句:.toLocaleLowerCase().indexOf("iPad") 肯定永远不会工作,是吗? iPad 不是小写。
  • @Spudley:是的,这是我的错字。
  • 我同意并理解这是不好的做法。请理解,我只是想在这里运行 POC。我的最终目标是测试 Tizen OS。

标签: javascript browser user-agent


【解决方案1】:

我的 JS 代码有数以千计的导航检查

在这种情况下,是你的 JS 代码有问题。

您基本上刚刚发现了进行 UA 字符串检测被认为是非常糟糕的做法的最终原因。

简而言之,如果您的代码看起来像描述的那样,那么您做错了什么。检测 UA 字符串的正当理由很少,而且这些理由都​​不适用于在客户端本身上运行的代码。

而且浏览器中有数千行这样的东西????这只会对您网站的性能造成不利影响。

有没有办法以编程方式设置 userAgent? MDN 说它是一个读写属性。

userAgent 字符串是只读值。

但是,您可以 override the getter,所以有办法让它可写。丑陋,但可能。

我真的建议避免这样做。

即使没有浏览器供应商故意更改他们的 UA 字符串来破坏这种代码(他们确实这样做了),您的任务基本上是永无止境的;每次发布新设备/浏览器/版本时,您都必须不断重新访问此代码,并且您的数千行代码会越来越大。

当然,如果用户修改了浏览器的 UA 字符串,这将是完全不可靠的。

如果必须,现在用 hack 修复它,但请注意,这会占用你越来越多的时间。您确实需要考虑切换到更好的编码实践,例如特征检测而不是 UA 检测。

【讨论】:

  • 事后才想到,“数千张这样的支票”是夸大其词,值得两次否决。谢谢你的黑客。我只需要确定一些东西并做出一些决定。
【解决方案2】:

我最近创建了一个 gist 以使只读属性可写(您可以找到一个示例来覆盖 navigator.userAgent)。就像 Spudley 说的,它很丑,不推荐,但我用它来进行单元测试以动态更改用户代理,所以要小心。

要点:https://gist.github.com/moehlone/bed7dd6cb38fc55bd640

【讨论】:

  • 这对我来说是完美的,因为我想将 socket.io 与 React Native 一起使用,但是一旦你添加了 socket.io,你必须将用户代理设置为“ReactNative”,否则你不能使用调试器!谢谢!
  • 有史以来最好的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2021-08-28
  • 2021-08-05
相关资源
最近更新 更多