是jQuery $ .browser不推荐?

Mar*_*_54 77 browser jquery

有人能告诉我,如果我认为jQuery的$ .browser已被弃用了吗?

我现有的实现会继续有效吗?如果没有,是否有一个易于实现的替代方案.

Emi*_*tus 95

第二个问题

我现有的实现会继续有效吗?如果没有,是否有一个易于实现的替代方案.

答案是肯定的,但不是没有一点工作.

$ .browser是一个官方插件,它包含在旧版本的jQuery中,所以像任何插件一样,你可以简单地复制它并将其合并到你的项目中,或者你可以简单地将它添加到任何jQuery版本的末尾.

如果您想使用它,我已经为您提取了代码.


// Limit scope pollution from any deprecated API
(function() {

    var matched, browser;

// Use of jQuery.browser is frowned upon.
// More details: http://api.jquery.com/jQuery.browser
// jQuery.uaMatch maintained for back-compat
    jQuery.uaMatch = function( ua ) {
        ua = ua.toLowerCase();

        var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
            /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
            /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
            /(msie) ([\w.]+)/.exec( ua ) ||
            ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
            [];

        return {
            browser: match[ 1 ] || "",
            version: match[ 2 ] || "0"
        };
    };

    matched = jQuery.uaMatch( navigator.userAgent );
    browser = {};

    if ( matched.browser ) {
        browser[ matched.browser ] = true;
        browser.version = matched.version;
    }

// Chrome is Webkit, but Webkit is also Safari.
    if ( browser.chrome ) {
        browser.webkit = true;
    } else if ( browser.webkit ) {
        browser.safari = true;
    }

    jQuery.browser = browser;

    jQuery.sub = function() {
        function jQuerySub( selector, context ) {
            return new jQuerySub.fn.init( selector, context );
        }
        jQuery.extend( true, jQuerySub, this );
        jQuerySub.superclass = this;
        jQuerySub.fn = jQuerySub.prototype = this();
        jQuerySub.fn.constructor = jQuerySub;
        jQuerySub.sub = this.sub;
        jQuerySub.fn.init = function init( selector, context ) {
            if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
                context = jQuerySub( context );
            }

            return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
        };
        jQuerySub.fn.init.prototype = jQuerySub.fn;
        var rootjQuerySub = jQuerySub(document);
        return jQuerySub;
    };

})();
Run Code Online (Sandbox Code Playgroud)

如果您问为什么有人需要折旧插件,我已准备好以下答案.

首先,答案是兼容性.由于jQuery是基于插件的,一些开发人员选择使用$ .browser和最新版本的jQuery,其中不包含$ .browser所有那些渲染无用的插件.

jQuery确实发布了一个迁移插件,该插件是为开发人员创建的,用于检测他们的插件是否使用了任何折旧的依赖项,如$ .browser.

虽然这有助于开发人员修补他们的插件.jQuery完全丢弃了$ .browser,因此上述修复可能是唯一的解决方案,直到您的开发人员修补或合并上述内容.

关于: jQuery.browser

  • 这有助于我获得第三方脚本仍然使用$ .browser来使用jQuery 1.9.0.谢谢! (7认同)
  • 天才! (3认同)
  • 我在这里找到了更正式版本(以及其他已弃用的功能):https://github.com/jquery/jquery-migrate/ (2认同)
  • 迁移插件是一个很好的工具,它允许用户在脚本中查看当前已弃用的函数列表,它确实为不推荐使用的函数提供了功能.不打算成为补丁. (2认同)

lon*_*day 68

文档:

$ .browser属性在jQuery 1.3中已弃用,其功能可能会在未来的jQuery版本中移动到团队支持的插件中.

所以,是的,它已被弃用,但您现有的实现将继续有效.如果删除了该功能,则可以使用插件轻松访问该功能.

至于是否有替代方案......答案是"是的,可能".使用$.support而不是浏览器检测进行功能检测要好得多:检测所需的实际功能,而不是提供它的浏览器.从浏览器到浏览器的各种重要功能都会被检测到.


20132月16日更新:在jQuery 1.9中,此功能已被删除(docs).最好不要使用它.如果你真的必须使用它的功能,你可以使用jQuery Migrate插件恢复它.

  • 和`$ .browser`已从`jQuery 1.9`中删除 (6认同)
  • IE和不同的IE版本有很多怪癖.是IE 7支持动画,但不,我不希望我的用户看到它!这太糟糕了.所以$ .browser在这种情况下非常方便. (6认同)
  • @Rocket [条件评论](http://www.quirksmode.org/css/condcom.html)肯定会更好. (5认同)
  • `$ .support`的问题是,如何检测我是否使用IE 7,因此需要添加CSS调整来修复我的页面? (4认同)

Ism*_*uel 6

在这里,我提出了一种基于功能可用性检测浏览器的替代方法.

要仅检测IE,您可以使用:

if(/*@cc_on!@*/false || typeof ScriptEngineMajorVersion === "function")
{
    //You are using IE>=4 (unreliable for IE11)
}
else
{
    //You are using other browser
}
Run Code Online (Sandbox Code Playgroud)

要检测最流行的浏览器:

if(/*@cc_on!@*/false || typeof ScriptEngineMajorVersion === "function")
{
    //You are using IE >= 4 (unreliable for IE11!!!)
}
else if(window.chrome)
{
    //You are using Chrome or Chromium
}
else if(window.opera)
{
    //You are using Opera >= 9.2
}
else if('MozBoxSizing' in document.body.style)
{
    //You are using Firefox or Firefox based >= 3.2
}
else if({}.toString.call(window.HTMLElement).indexOf('Constructor')+1)
{
    //You are using Safari >= 3.1
}
else
{
    //Unknown
}
Run Code Online (Sandbox Code Playgroud)

这个答案已经更新,因为IE11不再支持条件编译(/*@cc_on!@*/false技巧).
你可以检查IE11删除javascript条件编译吗?有关此主题的更多信息.
我已经使用了他们在那里提出的建议.
另外,您也可以使用typeof document.body.style.msTransform == "string"或者document.body.style.msTransform !== window.undefined甚至'msTransform' in document.body.style.

  • 不客气。我使用此代码在我的一些 javascript 代码的边缘情况下处理所有浏览器。如果其中任何一个停止工作,并且您检测到它,请尽快告诉我。 (2认同)