【问题标题】:How to determine the Opera browser using JavaScript如何使用 JavaScript 判断 Opera 浏览器
【发布时间】:2011-01-01 04:21:42
【问题描述】:

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

【问题讨论】:

  • 为什么需要检测Opera?而且,从您的问题来看,您似乎想检测没有 JS 的用户......这使用 JS 是不可能的。
  • 只有在有浏览器的情况下才需要调用一个js函数就是我在这里的原因......
  • 尽可能尝试检测问题而不是浏览器。我承认这有时很难:(
  • @Avinash:J-P 提出这个问题的原因是我们不知道您为什么要检查浏览器,在得到回复之后,我们仍然不知道。如果您检查是因为您想知道某个功能是否受支持(这通常是检查特定浏览器的原因),您应该尝试始终检查 该功能 而不是浏览器.如果你在想“函数 x 只存在于 opera 中,所以我只会在用户运行 opera 时调用它”,那么如果在更高版本的 opera 中删除了该函数会发生什么?相反:检查如果函数x存在,使用函数x
  • 您好 Avinash,您会考虑更改接受的答案吗? Opera 更改了他们的 userAgent 字符串,该答案的解决方案不再有效......

标签: javascript cross-browser opera


【解决方案1】:

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

navigator.userAgent.indexOf("Opera");

【讨论】:

  • 您应该尽可能使用特征检测。请参阅@S.Mark 的回答。
  • 我同意您应该尽可能使用特征检测,但这仍然是对如何确定客户端是否在运行opera这一明确问题的正确答案。如果问题是如何确定这个特定于歌剧的函数是否存在,那么检查那个函数会更好。 S.Mark 的建议虽然很方便(我也赞成),但根本不是特征检测。它依赖于仅存在于 opera 中的对象,并检查它,是的,但它不检查构成 opera-check-requirement 基础的 specific 功能(我们不知道)。
  • Justin... 导航器字符串是为浏览器检测而设计的。使用特征检测来检测浏览器比使用普通浏览器检测更糟糕。
  • 这个方法已经不行了,因为 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 的方法。 stackoverflow.com/a/17436191/1058552
  • 不再起作用了。使用:isOpera() {return (navigator.userAgent.indexOf("OPR") !== -1)};
【解决方案2】:

你介意使用 jQuery 吗?

那么你可以使用jQuery.browser (see documnentation)

但是 jQuery-guys 建议不要使用这个。

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

编辑:

对于 Mootools:使用 window.opera(请参阅 documentation

【讨论】:

  • 我正在使用 mootools 1.2 ,那么如何在 mootools1.2 中做到这一点?
  • 我编辑了我的帖子,但恕我直言,这可以通过谷歌很容易找到(就像我一样)
  • -1 为什么要提出连制作者都反对的东西?
  • 因为这是 Avinash 要求的,如何检测用户是否在使用 Opera。
  • @Justin:制造商不建议不要使用jQuery.browser 来找出客户端正在运行的浏览器,他们建议不要使用jQuery.browser 来检查特定的功能支持。该方法完全符合 OP 的要求; Natrium 提供了一个答案,提供了所要求的内容,同时指出有时不希望做所要求的事情(我们没有足够的关于 Avinash 正在做什么的信息来知道是否有明确的浏览器-check 在那种情况下是可以接受的)。如果我是你,我会删除反对票,这是非常有效的。
【解决方案3】:
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
}

【讨论】:

  • @Justin,这不是特征检测。如果有的话,它是基于功能的浏览器检测。请参阅nczonline.net/blog/2009/12/29/… ...另外window.opera && Object.toString.call(window.opera) == "[object Opera]" 将是一个更可靠的检查。
  • 对不起@S.Mark,我应该写Object.prototype.toString.call(window.opera)
  • @J-P: 在什么情况下最好使用Object.prototype.toString.call 而不是在对象上调用toString? (假设我们在那之前已经检查了 null )是否window.opera 应该实现自己的toString 函数?
  • @David,是的,就是这样。这并不是真正必要的——只是让检查更可靠一点。
  • Opera 16 不再有window.opera
【解决方案4】:

在 Prototype.js 中,we use this inference:

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]],但这似乎不太可能。

【讨论】:

    【解决方案5】:

    现在 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 匹配。它使Opera var 成为布尔值(真或假):

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

    【讨论】:

    • 或者? /Opera|OPR\//.test(navigator.userAgent)
    【解决方案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) 
    }
    

    新的 Opera 30 版本现在完全使用 Chromium 并将其 userAgent 更改为 OPR

    【讨论】:

    • 自 2021 年起效果很好,与您上面的答案不同,它不起作用!
    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多