使用Javascript检测Opera Mini浏览器

4

我已经为我的网站编写了一段javascript代码,用于检测它是否在移动设备上的Opera Mini浏览器中运行。由于Opera Mini具有数据节省功能,当启用该功能时,有时无法正确加载网站,因此我想通过检测所使用的浏览器是否为Opera Mini来显示一条消息。

下面发布的代码完美地适用于iOS上的Opera Mini,但在Android上不起作用。 有什么建议可以使代码也适用于Android上的Opera Mini?

<script type="text/javascript">
 function o(){
   var isMobile = {
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
                      },
                  };
     if( isMobile.Opera() ) alert('If you are using Opera Mini please disable Data Savings Mode to Have a pleasant browsing experience :)');
             }
 window.onload = o;
</script>


1
难道找出网站无法正常加载的原因并解决这个问题不是更好的选择吗? - Jeremy J Starcher
当启用数据节省模式时,网站将被发送到Opera的服务器进行压缩,然后再发送回请求浏览器,结果网站将以完全不同的方式加载。 - Adhip Rebello
添加缓存破坏器能够防止这种情况发生吗? - Jeremy J Starcher
3个回答

5

我之前从未听说过Opera Mini,但是我通过谷歌搜索找到了https://dev.opera.com/articles/opera-mini-and-javascript/。简单来说,她使用用户代理字符串来确定是否为Opera Mini。

var isOperaMini = (navigator.userAgent.indexOf('Opera Mini') > -1);

这非常类似于您的方法。

然而,她还建议您可以使用window对象来确定这一点。 "Opera Mini还将operamini对象作为window对象的属性之一。要检查是否存在此对象,请使用以下代码。"

var isOperaMini = Object.prototype.toString.call(window.operamini) === "[object OperaMini]"

如果您仍然无法使其正常工作,我建议您采用另一种方法。尝试使用保存功能进行保存,如果失败,则使用您打算使用的备用保存功能。因此,每当使用Opera Mini时,它都将能够使用数据节省功能,但当不是Opera Mini时,它将使用替代功能。在这里考虑try/catch。当然,您还需要考虑检索保存数据的实现方式。

2
我正在处理一个相同的挑战,即通过使用代理服务器来检测浏览器是否实现数据节省模式,但这将包括极速模式下的 Opera Mini 以外的更多内容。它将包括在Speed Mode下非常受欢迎的安卓 UC 浏览器 Mini、Chrome for Android的数据节省模式。幸运的是,现在可以在这三个浏览器上关闭此模式,尽管许多发展中国家的人们买不起,这也可能是选项如此受欢迎的原因。

Dean Hume提供了一个示例,说明如何在任何浏览器中检测用户是否已经打开数据节省模式。但要获取这些请求头,您需要使用服务器端脚本或者在他的示例中使用服务工作者,而不是传统的Javascript。

本回答解释了如何检测UC浏览器Mini Speed Mode

Tiffany Brown在Dev.Opera上发表的文章中,Jared Drake引用了这篇文章,并不情愿地推荐使用浏览器检测来检测Opera浏览器,而非特性检测。正如Jared所提到的,你可以使用以下方法:
 var isOperaMini = (navigator.userAgent.indexOf('Opera Mini') > -1);

 var isOperaMini = Object.prototype.toString.call(window.operamini) === "[object OperaMini]"

但她列出了一些不支持的浏览器事件,例如mousemovescroll,也许您可以嗅探它们。她还写了一篇关于在 Opera Mini 中查看和导出源代码的完整文章。她指出,Opera Mini(至少使用极限数据节省模式)实际上显示的是OPML而不是HTML。

值得庆幸的是,Opera Mini 提供了检查由 Opera 代理服务器渲染的当前 DOM 树的功能。在 Opera Mini 地址栏中输入server:source以查看当前加载页面的源代码。

您可能会在该源代码中看到有助于您检测的内容,尽管我没有在我的源代码中看到它。


0
我的解决方案大多是对已经提出的建议进行简化,已在实际设备上进行了测试。
检测 Opera Mini 就像这样简单:
if(window.operamini) { /* do something */ }

或者

isoperamini = !!window.operamini;  // returns true or false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接