【问题标题】:Is jQuery $.browser Deprecated?jQuery $.browser 是否已弃用?
【发布时间】:2012-03-27 03:37:48
【问题描述】:

有人可以告诉我,如果我认为 jQuery 的 $.browser 已被弃用是正确的吗?

我现有的实现会继续工作吗?如果没有,是否有易于实施的替代方案。

【问题讨论】:

标签: jquery browser


【解决方案1】:

第二个问题

我现有的实现会继续工作吗?如果没有,是否有 易于实施的替代方案。

答案是是的,但并非没有一点工作。

$.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;
    };

})();

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

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

jQuery 确实发布了一个migration plugin,它是为开发人员创建的,用于检测他们的插件是否使用了任何贬值的依赖项,例如 $.browser。

虽然这有助于开发人员修补他们的插件。 jQuery 完全放弃了 $.browser,因此在您的开发人员修补或合并上述问题之前,上述修复可能是唯一的解决方案。

关于: jQuery.browser

【讨论】:

  • 这帮助我获得了一个仍在使用 $.browser 与 jQuery 1.9.0 一起工作的第三方脚本。谢谢!
  • 我在这里找到了这个(以及其他已弃用的功能)的更正式版本:github.com/jquery/jquery-migrate
  • Migrate 插件是一个很好的工具,它允许用户查看当前已弃用的函数列表(如果有的话),它确实为已弃用的函数提供了功能。不打算成为补丁。
  • 同意。从那以后,我决定在等待第三方脚本的下一代时坚持使用 1.8.3。
  • +1,像 placeholder 属性这样的错误一直存在到我们必须处理的 IE10 中,并且需要 $.browser 来处理它......
【解决方案2】:

来自the documentation

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

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

至于是否有替代方案……答案是“是的,可能”。使用$.support 进行功能检测比浏览器检测要好得多:检测您需要的实际功能,而不是提供它的浏览器。可以检测不同浏览器的最重要功能。


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

【讨论】:

  • $.support 的问题是,我如何检测我是否使用的是 IE 7,因此需要添加 CSS 调整来修复我的页面?
  • @Rocket Conditional comments 当然会更好。
  • lonesomeday - 感谢您的补充评论。我们都在努力积累知识,有时需要帮助。
  • $.browser 已从jQuery 1.9 中删除
  • IE 和不同的 IE 版本有很多怪癖。是的 IE 7 支持动画,但不,我不希望我的用户看到它!这太糟糕了。所以 $.browser 在这种情况下真的很方便。
【解决方案3】:

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

要只检测 IE,你可以这样:

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

检测最流行的浏览器:

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
}

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

【讨论】:

  • 感谢您分享此内容。升级到 VS2013 并从 Nuget 包管理器下载 Jquery 和 Juice 后,我的日期选择器无法正常工作。粘贴代码,一切都恢复正常了。
  • 不客气。我使用此代码在我的一些 javascript 代码的边缘情况下处理所有浏览器。如果其中任何一个停止工作,并且如果您检测到它,请尽快告诉我。
  • /*@cc_on!@*/false 为 IE 边缘返回 false
  • @alex 您使用的确切版本和版本以及在哪个操作系统中?如果您是在虚拟机上使用,请您指定软件和版本吗?
  • @alex 抱歉耽搁了。我现在已经确定了答案。 IE真的搞砸了。但我已经做到了。请告诉我你的想法。
【解决方案4】:

更新! 2015 年 3 月 24 日(滚动到小时以下)

lonesomedayanswer 完全正确,我只是想我会添加这个花絮。不久前,我做了一个在 Vanilla JS 中获取浏览器的方法,并最终将其弯曲以在更高版本的 jQuery 中替换 jQuery.browser。它不会干扰新 jQuery 库的任何部分,但提供与传统 jQuery.browser 对象相同的功能,以及其他一些小功能。


新的扩展版本!

对于较新的浏览器来说更加彻底。此外,移动测试的准确率达到 90% 以上!我不会说 100%,因为我没有在每个移动浏览器上进行测试,但是新功能添加了 $.browser.mobile boolean/string。如果不是移动设备,则为 false,否则它将是移动设备或浏览器的字符串名称(最好的猜测是:Android、RIM 平板电脑、iPod 等......)。

一个可能的警告,可能不适用于某些较旧(不受支持)的浏览器,因为它完全依赖于 userAgent 字符串。

JS 缩小

/* quick & easy cut & paste */
;;(function($){if(!$.browser&&1.9<=parseFloat($.fn.jquery)){var a={browser:void 0,version:void 0,mobile:!1};navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook Android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]{1,}; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0<parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,""))?parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,"")):"Edge",/Trident/i.test(a.ua)&&/rv:([0-9]{1,}[\.0-9]{0,})/.test(a.ua)&&(a.version=parseFloat(a.ua.match(/rv:([0-9]{1,}[\.0-9]{0,})/)[1].replace(/[^0-9\.]/g,"")))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].replace(/[^0-9\.]/g,""))):/Kindle|Silk|KFTT|KFOT|KFJWA|KFJWI|KFSOWI|KFTHWA|KFTHWI|KFAPWA|KFAPWI/i.test(a.ua)?(a.mobile="Kindle",/Silk/i.test(a.ua)?(a.browser="Silk",a.version=parseFloat(a.ua.split("Silk/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,"")))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].replace(/[^0-9\.]/g,""))):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/BB[0-9]{1,}; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].replace(/[^0-9\.]/g,""))):/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].replace(/[^0-9\.]/g,""))));if(a.browser)for(var b in a.browserArray)a[a.browserArray[b].toLowerCase()]=a.browser==a.browserArray[b];$.extend(!0,$.browser={},a)}})(jQuery);
/* quick & easy cut & paste */

jsFiddle "jQuery Plugin: Get Browser (Extended Alt Edition)"

/**	jQuery.browser
 *	@author	J.D. McKinstry (2014)
 *	@description	Made to replicate older jQuery.browser command in jQuery versions 1.9+
 *	@see http://jsfiddle.net/SpYk3/wsqfbe4s/
 *
 *	@extends	jQuery
 *	@namespace	jQuery.browser
 *	@example	jQuery.browser.browser == 'browserNameInLowerCase'
 *	@example	jQuery.browser.version
 *	@example	jQuery.browser.mobile	@returns	BOOLEAN
 *	@example	jQuery.browser['browserNameInLowerCase']
 *	@example	jQuery.browser.chrome	@returns	BOOLEAN
 *	@example	jQuery.browser.safari	@returns	BOOLEAN
 *	@example	jQuery.browser.opera	@returns	BOOLEAN
 *	@example	jQuery.browser.msie	@returns	BOOLEAN
 *	@example	jQuery.browser.mozilla	@returns	BOOLEAN
 *	@example	jQuery.browser.webkit	@returns	BOOLEAN
 *	@example	jQuery.browser.ua	@returns	navigator.userAgent String
 */
;;(function($){if(!$.browser&&1.9<=parseFloat($.fn.jquery)){var a={browser:void 0,version:void 0,mobile:!1};navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook Android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]{1,}; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0<parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,""))?parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,"")):"Edge",/Trident/i.test(a.ua)&&/rv:([0-9]{1,}[\.0-9]{0,})/.test(a.ua)&&(a.version=parseFloat(a.ua.match(/rv:([0-9]{1,}[\.0-9]{0,})/)[1].replace(/[^0-9\.]/g,"")))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].replace(/[^0-9\.]/g,""))):/Kindle|Silk|KFTT|KFOT|KFJWA|KFJWI|KFSOWI|KFTHWA|KFTHWI|KFAPWA|KFAPWI/i.test(a.ua)?(a.mobile="Kindle",/Silk/i.test(a.ua)?(a.browser="Silk",a.version=parseFloat(a.ua.split("Silk/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,"")))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].replace(/[^0-9\.]/g,""))):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/BB[0-9]{1,}; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].replace(/[^0-9\.]/g,""))):/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].replace(/[^0-9\.]/g,""))));if(a.browser)for(var b in a.browserArray)a[a.browserArray[b].toLowerCase()]=a.browser==a.browserArray[b];$.extend(!0,$.browser={},a)}})(jQuery);
/* - - - - - - - - - - - - - - - - - - - */

var b = $.browser;
console.log($.browser);    //    see console, working example of jQuery Plugin
console.log($.browser.chrome);

for (var x in b) {
    if (x != 'init')
        $('<tr />').append(
            $('<th />', { text: x }),
            $('<td />', { text: b[x] })
        ).appendTo($('table'));
}
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; }
th { text-align: right; }

textarea { height: 500px; width: 100%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table></table>

【讨论】:

    【解决方案5】:

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

    来自http://api.jquery.com/jQuery.browser/

    【讨论】:

    • $.browser 在 v1.9 中被移除
    【解决方案6】:

    来自http://api.jquery.com/jQuery.browser/的官方文档:

    此属性在 jQuery 1.9 中被删除,仅可通过 jQuery.migrate 插件使用。

    您可以使用例如jquery-migrate-1.4.1.js 来保持现有代码或使用 $.browser 的插件仍然有效,同时您可以找到一种方法在将来从您的代码中完全摆脱 $.browser。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 2018-09-12
      • 2017-12-06
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2011-07-30
      相关资源
      最近更新 更多