如何使用JavaScript判断Opera浏览器

25

我想要使用JavaScript确定客户端浏览器是否为Opera,该怎么做?


为什么需要检测Opera?从你的问题中,似乎你想要检测没有JS的用户...但是使用JS来实现这个功能有点不可能。 - James
我需要调用一个JS函数,但仅当浏览器是Opera时才需要,这就是我在这里的原因...... - Avinash
2
尽可能地,尝试检测问题而不是浏览器。我承认有时这很困难 :( - hallvors
3
@Avinash: J-P提出问题的原因是我们不知道为什么你在检查浏览器,而在你的回答之后,我们仍然不知道。如果你是在检查浏览器是因为想知道某个特定功能是否被支持(这通常是检查特定浏览器的原因),那么你应该尝试始终检查那个功能而不是浏览器。如果你在想“函数x只存在于Opera中,所以我将只在用户运行Opera时调用它”,那么如果该函数在以后的Opera版本中被删除会发生什么?相反:检查如果函数x存在,则使用函数x - David Hedlund
嗨,Avinash,你会考虑更改已接受的答案吗?Opera 更改了他们的 userAgent 字符串,那个答案的解决方案不再起作用了... - brasofilo
6个回答

40

现在Opera使用Chrome渲染引擎,原先的解决方案不再适用。用户代理字符串如下:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.132

唯一用于识别Opera的部分是OPR

以下是我使用的代码,可以匹配旧版或新版Opera。它将Opera变量设置为布尔值(true或false):

var Opera = (navigator.userAgent.match(/Opera|OPR\//) ? true : false);


3
或者?/Opera|OPR\//.test(navigator.userAgent) - Sarsaparilla

18
if(window.opera){
    //do stuffs, for example
    alert(opera.version()); //10.10 
}

说真的,在Opera浏览器中确实有一个opera对象。

你可能会认为 opera 对象是可被覆盖的,但是navigator对象也是可被覆盖的。

更新:

为了获得更准确的结果,你可以这样做:

if (window.opera && opera.toString() == "[object Opera]"){
    //do stuffs, tested on opera 10.10
}

我注意到,Opera浏览器支持addEventListener和attachEvent两种方式,还有另一种方法,如下所示:

if (window.addEventListener && window.attachEvent){
    //do stuffs, tested on opera 10.10
}

3
@Justin,这不是特性检测,如果非要说的话,这是基于特性的浏览器检测。请参考http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/... 另外,window.opera && Object.toString.call(window.opera) == "[object Opera]"是一种更加可靠的检测方法。 - James
1
抱歉,@S.Mark,我应该写成 Object.prototype.toString.call(window.opera) - James
1
@J-P:在什么情况下使用Object.prototype.toString.call比调用对象的toString更可取?(假设我们在此之前已经检查了null)是因为window.opera应该实现自己的toString函数吗? - David Hedlund
1
@David,没错,就是这样。这并不是必要的 - 只是让检查更可靠一些。 - James
5
Opera 16不再具有window.opera - nickf
显示剩余2条评论

9

以上的回答已经不适用于新版Opera 30。由于现在的Opera使用了Chromium,因此请使用以下方法:

var isChromium = window.chrome,
    isOpera = window.navigator.userAgent.indexOf("OPR") > -1 || window.navigator.userAgent.indexOf("Opera") > -1;
if(isChromium !== null && isOpera == true) {
   // is Opera (chromium)
} else { 
   // not Opera (chromium) 
}

新的Opera 30版本现已完全采用了Chromium,并将其userAgent更改为OPR。

1
截至2021年,它运行良好,而不像您上面的答案那样无法工作! - Dennis Kozevnikoff

7
在Prototype.js中,我们使用这种推理方式
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';

这个测试基本上检查window.opera对象是否存在,以及其内部的[[Class]]值是否为“Opera”。这是比仅检查window.opera存在性更可靠的测试,因为很少有其他无关全局变量opera干扰并导致误报的可能性。
说到无关的全局变量,在MSHTML DOM中,例如,元素可以通过id / name在全局范围内解析;这意味着标记中类似于<a name="opera" href="...">foo</a>的存在将导致window.opera引用该锚元素。这就是误报的原因...
换句话说,要测试[[Class]]值,而不仅仅是存在性。
当然,在嗅探浏览器之前一定要三思。通常有更好的方法来解决问题 ;)
附言:未来版本的Opera有可能会改变window.opera的[[Class]],但这似乎不太可能发生。

4

navigator对象包含了所有你需要的信息。以下代码可以实现:

navigator.userAgent.indexOf("Opera");

1
尽可能使用特性检测。请参考 @S.Mark 的回答。 - Justin Johnson
5
我同意尽可能使用特性检测,但这仍然是正确的答案来回答明确的问题,即如何确定客户端是否正在运行Opera。如果问题是如何确定此基于Opera的函数是否存在,则检查该函数将更为可取。S.Mark的建议虽然非常便利(我也投了赞同票),但它几乎不是特性检测。它依赖于一个只在Opera中存在的对象,并检查它,但它并没有检查Opera要求的潜在特定功能(我们不知道它是什么)。 - David Hedlund
5
Justin...导航器字符串是用于浏览器检测的。使用特性检测来检测浏览器甚至比使用纯浏览器检测还要糟糕。 - James
10
这种方法已经不再适用,因为Opera改用了Chrome的渲染引擎。这意味着navigator.userAgent会提供类似于这样的内容:“Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/28.0.1500.95 Safari/537.36 OPR/15.0.1147.153"。请注意,此时没有“Opera”,因此结果始终为-1。要么通过功能检测来识别Opera,要么使用@Zack Katz以下的方法。https://dev59.com/k3I-5IYBdhLWcg3wJEwK#17436191 - Daniel Blaichinger
2
不再起作用。使用:isOpera() {return (navigator.userAgent.indexOf("OPR") !== -1)}; - lukyer
显示剩余2条评论

-1

你介意使用jQuery吗?

那么你可以使用jQuery.browser请参阅文档

但是jQuery团队建议不要使用这个。

我们建议不要使用此属性,请尝试使用功能检测(请参见jQuery.support

编辑:

对于Mootools:使用window.opera(请参见文档


我正在使用 MooTools 1.2,那么如何在 MooTools 1.2 中实现这个? - Avinash
我编辑了我的帖子,但我认为这可以很容易地在谷歌上找到(就像我一样)。 - Natrium
为什么建议一些甚至制造商都反对的东西呢? - Justin Johnson
因为这是 Avinash 要求的,如何检测用户是否在使用 Opera。 - Natrium
4
制作者并不建议使用jQuery.browser来查找客户端正在运行的浏览器,而是建议不要使用jQuery.browser来检查特定功能的支持。该方法恰好可以实现OP所请求的内容;Natrium提供了一个回答,提供了所需的内容,并指出在某些情况下不希望执行所请求的操作(我们不知道Avinash正在从事什么工作,因此无法确定在该场景中是否愿意使用显式的浏览器检查)。如果我是您,我会取消投票反对此问题,因为这是相当有效的。 - David Hedlund

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