我想要使用JavaScript确定客户端浏览器是否为Opera,该怎么做?
我想要使用JavaScript确定客户端浏览器是否为Opera,该怎么做?
现在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);
/Opera|OPR\//.test(navigator.userAgent)
- Sarsaparillaif(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
}
window.opera && Object.toString.call(window.opera) == "[object Opera]"
是一种更加可靠的检测方法。 - JamesObject.prototype.toString.call(window.opera)
。 - JamesObject.prototype.toString.call
比调用对象的toString
更可取?(假设我们在此之前已经检查了null)是因为window.opera
应该实现自己的toString
函数吗? - David Hedlundwindow.opera
。 - nickf以上的回答已经不适用于新版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)
}
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
window.opera
对象是否存在,以及其内部的[[Class]]值是否为“Opera”。这是比仅检查window.opera
存在性更可靠的测试,因为很少有其他无关全局变量opera
干扰并导致误报的可能性。<a name="opera" href="...">foo</a>
的存在将导致window.opera
引用该锚元素。这就是误报的原因...window.opera
的[[Class]],但这似乎不太可能发生。navigator
对象包含了所有你需要的信息。以下代码可以实现:
navigator.userAgent.indexOf("Opera");
你介意使用jQuery吗?
那么你可以使用jQuery.browser
(请参阅文档)
但是jQuery团队建议不要使用这个。
我们建议不要使用此属性,请尝试使用功能检测(请参见jQuery.support)
编辑:
对于Mootools:使用window.opera
(请参见文档)
jQuery.browser
来查找客户端正在运行的浏览器,而是建议不要使用jQuery.browser
来检查特定功能的支持。该方法恰好可以实现OP所请求的内容;Natrium提供了一个回答,提供了所需的内容,并指出在某些情况下不希望执行所请求的操作(我们不知道Avinash正在从事什么工作,因此无法确定在该场景中是否愿意使用显式的浏览器检查)。如果我是您,我会取消投票反对此问题,因为这是相当有效的。 - David Hedlund