【问题标题】:What is the correct way to detect Opera using jQuery?使用 jQuery 检测 Opera 的正确方法是什么?
【发布时间】:2010-10-13 07:03:33
【问题描述】:

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,但该页面告诉我的是亚马逊在线阅读器最适合 IE > 6.0、Firefox > 1.5 或 Safari > 2.0
  • 一个很好的例子,说明为什么浏览器检测和“不支持的浏览器”消息几乎总是一个糟糕的想法。
  • 好吧,this 特定的 sn-p 嗅探确实试图允许 Opera,但正如下面的答案之一所说,亚马逊在其他地方有更多的浏览器嗅探,包括服务器端嗅探,这对 Opera 不友好。

标签: javascript jquery opera browser-detection


【解决方案1】:

在 jQuery 1.3 之前,您可以使用 jQuery.browser:

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

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

这样做的主要原因是应该避免检查浏览器,因为功能可能会因版本而异,从而使您的代码立即过时。

您应该始终尝试使用feature detection。这将允许您查看当前浏览器是否支持您尝试使用的功能,无论浏览器品牌、版本等。

【讨论】:

  • 精准。这就是我正在寻找的代码。现在希望亚马逊会听... :)
  • 很高兴为您提供帮助,莉斯塔。如果这对您有帮助,您能否将其标记为已解决?谢谢!
  • 明确地说,jQuery 1.3+ 实际上并没有删除 jQuery.browser。 "jQuery.browser will not be removed from future versions"。但是,关于特征检测,您是对的。
  • +1。但是:仍然存在使用 jQuery.browser 的合法用例。示例:Opera 11 很高兴地支持 <input> 元素上的 placeholder 属性,但 does not allow styling of them。如果我们只使用特征检测,我们最终会得到一个无法设置样式的占位符文本。相反,使用 jQuery.browser 检查 Opera,然后回退到可样式化的替代方案。
  • 供以后参考,需要注意的是jQuery 1.9将删除jQuery.browser。
【解决方案2】:

有一个特殊的 window.opera 对象存在于所有 Opera 5+ 浏览器中。所以很简单:

if (window.opera && window.opera.buildNumber) { 
    // we are in Opera 
}

足够了。

【讨论】:

  • 不,这还不够。 - 因为,如果在页面的某个地方,您有带有id="opera" 的元素,那么if(window.opera) 将报告为真。在所有浏览器中。
  • 如果 (window.opera && window.opera.version) 这在其他浏览器中不成立,您可以这样做。
  • 这可能对 Opera mini 有用:abeautifulsite.net/blog/2011/11/…
  • 不再起作用了。使用:isOpera() {return (navigator.userAgent.indexOf("OPR") !== -1)};
【解决方案3】:

我像这样检查 Opera:

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

为什么要使用 jQuery?

【讨论】:

  • 我不知道——这是亚马逊。我写了他们的技术支持,但像往常一样,技术支持的人从未听说过 javascript。啊。我认为向他们发送修复程序比寻求帮助更有效率,因为修复程序实际上可能会转发给程序员而不是 CSR。
  • 啊,任何 Web 开发人员能做的最好的事情就是停止检测浏览器 :-)
【解决方案4】:

检测 javascript 功能比检测浏览器 userAgent 要好得多。

即 DOM、XmlHttpRequest、事件模型(event.target vs event.srcElement)、ActiveX、Java 等

通过专注于您需要的 API 函数,而不是目标浏览器,您将创建一组更强大的脚本,并且不可避免地会减少特殊的大小写。

opera 的此链接可能会告诉您更多信息

【讨论】:

    【解决方案5】:

    Opera 自己的一个非常简单的方法:

    if (window.opera) {
        //this browser is Opera
    }
    

    来源:http://my.opera.com/community/openweb/idopera/

    【讨论】:

      【解决方案6】:

      亚马逊在 Opera 上失败的主要原因是因为已经从服务器端发送了不同的代码...如果您使用 Firefox 访问同一页面,然后保存该页面并在 Opera 中重新打开它,它可以正常工作...

      但他们承诺在一月份的某个时候解决这个问题......

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          我不确定(我从来没有真正检查过歌剧),但如果内置的 jQuery 功能没有检测到歌剧,可能是 jQuery 的一个错误,需要修复。我怀疑如果是这样的话,它应该会很快得到解决。

          【讨论】:

          • jQuery 说它与 Opera 兼容,docs.jquery.com/Utilities/jQuery.browser 的示例页面完美地检测到我的浏览器。我不认为这是一个 jQuery 错误。这必须与他们使用它的方式有关。
          【解决方案9】:

          在当前的 HTML5 时代,您也可以改为经常检查浏览器功能。

          if (!window.FormData) { alert("xmlhttprequest L2 FormData interface not available"); }
          

          【讨论】:

            猜你喜欢
            • 2011-12-11
            • 1970-01-01
            • 2018-12-20
            • 1970-01-01
            • 2016-01-11
            • 1970-01-01
            • 2010-10-03
            • 2013-11-16
            相关资源
            最近更新 更多