7

好的,这是我设法进入的边缘案例。我正在新的 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 的另一种聪明方法或设置它的正确方法。谢谢。

4

2 回答 2

15

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

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

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

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

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

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

userAgent 字符串是只读值。

但是,您可以 覆盖 getter,因此有一些方法可以使其可写。丑陋,但可能。

我真的建议避免这样做。

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

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

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

于 2013-09-23T14:18:59.100 回答
6

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

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

于 2016-03-17T08:37:15.840 回答