使用jQuery检测Opera的正确方法是什么?

15

最近Amazon.com更新了他们的JavaScript代码,导致部分Opera浏览器出现问题。

他们的浏览器检测代码如下,但存在缺陷:

    function sitbReaderIsCompatibleBrowser() {
        if (typeof(jQuery) == 'undefined') {
            return false;
        } else {
            var version = jQuery.browser.version || "0";
            var splitVersion = version.split('.');
            return (
                   (jQuery.browser.msie && splitVersion[0] >= 6)  // IE 6 and higher
                || (jQuery.browser.mozilla && (
                       (splitVersion[0] == 1 && splitVersion[1] >= 8) // Firefox 2 and higher
                    || (splitVersion[0] >= 2)
                   ))
                || (jQuery.browser.safari && splitVersion[0] >= 500) // Safari 5 and higher
                || (jQuery.browser.opera && splitVersion[0] >= 9) // Opera 5 and higher
            );
        }
}

这段代码中没有明显的错误,但我以前从未使用过jQuery,因此不确定。

尽管该代码看起来像是试图让Opera用户通过,但当我使用Opera 9.64访问该页面时,会收到一个“不支持的浏览器”消息。如果我更改Opera的设置,将其报告为Firefox,则页面可以正常工作!考虑到这一点,我相信这是脚本的问题,而不是浏览器的问题。

有任何jQuery专家有建议吗?

你可以通过访问亚马逊上的任何一本书并单击“查看此书内部”链接来复制此行为。


我也在使用 Opera 9.64,但那个页面告诉我的是 Amazon 在线阅读最适合使用 IE > 6.0、Firefox > 1.5 或 Safari > 2.0。 - Ionuț G. Stan
3
为什么浏览器检测和“不支持的浏览器”提示信息通常都是一个糟糕的想法的一个很好的例子。 - tgecho
这段代码确实尝试允许Opera浏览器,但正如下面的一个答案所说,亚马逊在其他地方进行了更多的浏览器嗅探,包括不友好于Opera的服务器端嗅探。 - hallvors
9个回答

20

在 jQuery 1.3 以前,你可以使用 jQuery.browser

if( $.browser.opera ){
  alert( "You're using Opera version "+$.browser.version+"!" );
}

从1.3版本开始,您应该改用jQuery.support

主要原因是应该避免检查浏览器,因为功能可能会随着版本而改变,使您的代码很快过时。

您应该始终尝试使用特性检测。这将允许您查看当前浏览器是否支持您正在尝试使用的功能,而不管浏览器品牌、版本等。


太准了。这就是我在找的代码。现在希望亚马逊能听到... :) - Lisa
1
要明确的是,jQuery 1.3+实际上并没有删除jQuery.browser。 "jQuery.browser将不会从未来版本中删除". 但是,您对功能检测是正确的。 - Yahel
+1。然而:仍有合理的用例来使用jQuery.browser。例如:Opera 11可以在<input>元素上支持placeholder属性,但是却不允许对它们进行样式化。如果我们只使用特性检测,最终会得到一个无法进行样式化的占位文本。相反,使用jQuery.browser来检查Opera,然后回退到可进行样式化的备选方案。 - Jess Telford
1
值得注意的是,jQuery 1.9 将删除 jQuery.browser,以供将来参考。 - Nico Burns

11

在所有Opera 5+浏览器中都存在一个特殊的window.opera对象。因此,像下面这样简单的操作:

if (window.opera && window.opera.buildNumber) { 
    // we are in Opera 
}
足够了。

4
不行,这样不够。因为如果页面中某处有 id="opera" 的元素,那么 if(window.opera) 将返回 true,在所有浏览器中都是如此。 - c69
1
如果您想在其他浏览器中使用此代码,那么应该这样写:if (window.opera && window.opera.version)。但是请注意,在其他浏览器中,这个条件语句可能不成立。 - Igor Jerosimić
这可能对Opera mini有用:http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript/ - Junior Mayhé
不再起作用。使用:isOpera() {return (navigator.userAgent.indexOf("OPR") !== -1)}; - lukyer

5

我这样检查Opera:

if (/Opera/.test (navigator.userAgent)) // do something

为什么你需要使用jQuery?

我不知道——这是亚马逊的问题。我写了他们的技术支持,但通常技术支持的人从未听说过JavaScript。啊。我认为发送一个解决方案比寻求帮助更有生产力,因为一个解决方案实际上可能会被转发给程序员,而不是客户服务代表。 - Lisa
2
啊,任何网页开发者最好的做法就是停止检测浏览器本身 :-) - Ilya Birman

5

检测 JavaScript 能力比检测浏览器 userAgent 更好。

例如,ie DOM、XmlHttpRequest、事件模型(event.target vs event.srcElement)、ActiveX、Java 等。

集中关注所需 API 函数,而不是特定的浏览器,将创建更健壮的脚本集,并减少特定情况的出现。

这里的链接在 opera 可能会告诉你更多信息。


2

1

我认为这种方式是最好的。
if ( window.opera.version() == 12) { }
这个例子检查Opera版本是否为12。在我在Opera中遇到字体问题时非常有用。


1
主要原因是亚马逊在Opera上失败的原因是他们从服务器端发送了不同的代码...如果你用Firefox访问同样的页面,然后保存该页面并在Opera中重新打开它,它就可以正常工作...
但他们承诺在一月份解决这个问题...

0
在当前的HTML5时代,您也可以经常检查浏览器功能。
if (!window.FormData) { alert("xmlhttprequest L2 FormData interface not available"); }

0
我不确定(反正我从来没有检查过Opera),但如果内置的jQuery功能无法检测到Opera,可能是jQuery中需要修复的错误。如果确实是这种情况,我认为它应该会很快解决。

1
jQuery表示它与Opera兼容,并且http://docs.jquery.com/Utilities/jQuery.browser上的示例页面可以完美地检测到我的浏览器。我不认为这是jQuery的错误。这一定是关于他们使用它的方式的问题。 - Lisa

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