我正在创建一个在UC Browser / Mini中无法正确呈现的网站。我打算用javascript覆盖样式。提前谢谢。
答案 0 :(得分:3)
在JavaScript中检测UC Mini:
if (navigator.userAgent.match(/^Mozilla\/5\.0 .+ Gecko\/$/)) {
// ...
}
UC提供的官方Developer Documentation(1)记录了浏览器中使用的各种用户代理字符串。主要的两种模式是这两种模式,用于UC浏览器和UC Mini。
# UC Browser
"Mozilla/5.0 (..) .. UCBrowser/10.7.9.856 U2/1.0.0 .."
# UC Mini with Speed Mode on (enabled by default)
"UCWEB/2.0 (..) .. UCBrowser/10.7.9.856 U2/1.0.0 Mobile"
有一点需要注意的是,UC浏览器和UC Mini是不同的应用程序。 UC浏览器适用于iPhone / iOS和Android,具有各种数据保护选项(包括“Speedmode”选项),但与UC Mini的速度模式无关,也不会改变用户代理。
UC Mini仅适用于Android。在速度模式下,UC Mini是代理浏览器,这意味着其请求通过远程服务器进行代理。此代理服务器将“UCWEB”字段添加到用户代理。与Opera Mini类似,UC Mini Speed Mode在远程服务器上呈现内容(包括JavaScript)。有趣的是,此远程Web浏览器中的DOM报告的用户代理与其网络层不同。 UC Mini Speed Mode中的navigator.userAgent
始终报告以下奇怪的固定字符串,没有任何“UCWEB”,“UCBrowser”或客户端自己的用户代理的痕迹:
Mozilla/5.0 (X11; U; Linux i686; zh-CN; r:1.2.3.4) Gecko/
此精确字符串用于在速度模式下使用UC Mini for Android的所有客户端。请注意尾部斜杠“Linux”和“zh-CN”。我建议使用如下的正则表达式来检测它:
/^Gecko\/$/
或者,稍微保守一点:
/^Mozilla\/5\.0 .+ Gecko\/$/
这是一个浏览器嗅到噩梦,但这就是我们所拥有的一切。为了验证,我针对一周的维基百科生产流量(未采样,~100B请求)运行它,零匹配。当然,UC Mini也不匹配,因为它只在DOM中使用该字符串。从理论上讲,其他浏览器也可能有不同用户代理字符串的DOM,但至少我们知道它与当前正在使用的内容不匹配。
答案 1 :(得分:2)
使用navigator.userAgent查看是否正在使用Opera Mini或UC浏览器。
以下示例是如何检测是否正在使用UCBrowser
if (navigator.userAgent.indexOf(' UCBrowser/') >= 0) {
// do stuff here
}
navigator.userAgent将返回字符串中的内容列表。与上面的示例一样,navigation.userAgent将返回一个字符串,其中包含“UCBrowser”,因为在UC浏览器中使用了javascript。因此,上面的代码段会为这样的行编制索引,并确定在userAgent输出中找到索引行的条件。
我不确定这是否有效,因为我无法在Opera Mini上测试我的本地文件,但根据我的研究,下面的代码可能会有效。
if (navigator.userAgent.indexOf('Opera Mini') >= 0) {
// do stuff here
}
答案 2 :(得分:1)
navigator.userAgent
是您正在寻找的内容,但已被弃用。
但理想情况下,您并不想依赖用户代理。 (见:https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent)。如果UC Browser / Mini中存在渲染错误,它也可能存在于其他浏览器中。找到修复bug的方法比尝试查找和定位它发生的每个浏览器更好。