如何使用JavaScript确定Opera浏览器

Avi*_*ash 20 javascript opera cross-browser

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

Zac*_*atz 37

现在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相匹配.它使Operavar成为一个布尔值(true或false):

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

  • 要么?`/歌剧|.OPR\//测试(navigator.userAgent的)` (2认同)

YOU*_*YOU 18

if(window.opera){
    //do stuffs, for example
    alert(opera.version()); //10.10 
}
Run Code Online (Sandbox Code Playgroud)

不开玩笑,opera歌剧浏览器中有一个对象.

您可能认为,对象opera可以覆盖,但navigator也可以覆盖.

更新:

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

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

我注意到,Opera有addEventListener和attachEvent,所以还有另外一种方式

if (window.addEventListener && window.attachEvent){
    //do stuffs, tested on opera 10.10
}
Run Code Online (Sandbox Code Playgroud)

  • Opera 16没有'window.opera`了 (4认同)
  • @Justin,这不是特征检测.如果有的话,它是基于功能的浏览器检测.请参阅http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/ ...还有`window.opera && Object.toString.call(window.opera) =="[对象歌剧]"`将是一个更可靠的检查. (3认同)

kan*_*gax 8

在Prototype.js中,我们使用此推断:

var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
Run Code Online (Sandbox Code Playgroud)

这基本上检查该window.opera对象是否存在,其内部[[Class]]值是"Opera".这是一个比仅仅检查window.opera存在更稳固的测试,因为一些不相关的全局opera变量阻碍并导致误报的可能性要小得多.

说到不相关的全局变量,请记住,在MSHTML DOM中,元素可以通过id/name全局解析; 这意味着<a name="opera" href="...">foo</a>在标记中存在某些内容将导致window.opera引用该锚元素.这是你的误报......

换句话说,测试[[Class]]值,而不仅仅是存在.

当然,在嗅探浏览器之前总是三思而后行.通常有更好的方法来解决问题;)

PS未来版本的Opera有可能改变[[Class]] window.opera,但这似乎不太可能.


Jon*_*llo 6

上述答案在新的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) 
}
Run Code Online (Sandbox Code Playgroud)

新的Opera 30版本现在完全使用Chromium,并将其更改userAgentOPR


Dav*_*und 5

navigator对象包含您需要的所有信息.这应该做:

navigator.userAgent.indexOf("Opera");
Run Code Online (Sandbox Code Playgroud)

  • 此方法不再起作用,因为Opera切换到Chrome的渲染引擎.这意味着navigator.userAgent提供了这样的东西:"Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/28.0.1500.95 Safari/537.36 OPR/15.0.1147.153"注意,没有"Opera",所以结果总是-1.通过特征检测识别Opera或使用下面的@Zack Katz方法.http://stackoverflow.com/a/17436191/1058552 (10认同)
  • 我同意你应该尽可能使用特征检测,但这仍然是*如何确定客户端是否正在运行opera*的明确问题的正确答案.如果问题是*如何确定这个特定于歌剧的函数是否存在*那么检查该函数将是更可取的.S.Mark的建议,虽然相当方便(我也赞成它),但几乎不是特征检测.它依赖于一个只存在于opera中的对象,并检查它,是的,但它不会检查作为opera-check-requirement基础的*特定*特征(我们不知道). (5认同)
  • Justin ...导航器字符串专为浏览器检测而设计.使用特征检测来检测浏览器比使用普通浏览器检测更糟糕. (5认同)
  • 不工作了。使用: isOpera() {return (navigator.userAgent.indexOf("OPR") !== -1)}; (2认同)