JQuery $. 浏览器是否已弃用?

有人能告诉我,我是否正确地认为 jQuery 的 $. 浏览器已被弃用?

我现有的实现会继续工作吗? 如果不会,是否有一个容易实现的替代方案。

114783 次浏览

“ The $。浏览器属性在 jQuery 1.3中不被推荐,它的功能可能会在将来的 jQuery 版本中转移到一个团队支持的插件中。”

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

来自 文件:

$.浏览器属性在 jQuery 1.3中已被弃用,其功能可能会在将来的 jQuery 版本中转移到团队支持的插件中。

因此,是的,它已被废弃,但是您现有的实现将继续工作。如果这个功能被删除,那么使用一个插件就可以很容易地访问它。

至于是否还有其他选择... ... 答案是“是的,很可能”。使用 $.support特征提取比使用浏览器检测要好得多: 检测你真正需要的功能,而不是提供这些功能的浏览器。最重要的特性,因浏览器而异的检测。


更新于2013年2月16日: 在 jQuery 1.9中,此特性被删除(医生)。最好不要使用它。如果你真的,真的 必须的使用它的功能,你可以恢复与 JQuery 迁移插件。

第二个问题

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

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

$.浏览器是一个官方插件,包含在旧版本的 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 是基于插件的,所以一些开发人员选择使用 $。浏览器和 jQuery 的最新版本,其中不包括 $。浏览那些没用的插件。

JQuery 确实发布了一个 迁移插件,它是为开发人员创建的,用于检测他们的插件是否使用了任何折旧的依赖项,比如 $。浏览器。

尽管这有助于开发者修补他们的插件。JQuery 丢失了 $。浏览器完全,所以上述修复可能是唯一的解决方案,直到您的开发人员补丁或纳入上述。

关于: < a href = “ https://api.jquery.com/jQuery.Browser/”rel = “ noReferrer”> jQuery.Browser

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

为了只检测 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技巧) ,这个答案被更新了。
您可以检查 IE11删除了 javascript 条件编译吗?以获得有关此主题的更多信息。
我采纳了他们的建议。
或者,您可以使用 typeof document.body.style.msTransform == "string"document.body.style.msTransform !== window.undefined,甚至 'msTransform' in document.body.style

更新于2015年3月24日(小时下方)

Lonesomeday 回答是绝对正确的,我只是想我会添加这个花边新闻。前段时间,我制作了一个在 Vanilla JS 中获取浏览器的方法,并最终将其曲线化,以取代后来版本的 jQuery 中的 jQuery.browser。它不会干扰新 jQuery 库的任何部分,但是提供了与传统 jQuery.browser对象相同的功能,以及其他一些小特性。


新的扩展版本!

对于较新的浏览器来说更为全面。此外,90% 以上的准确性在移动测试!我不会说100% ,因为我还没有在每一个移动浏览器上测试过,但是新的特性增加了 $.browser.mobile布尔值/字符串。如果不是移动设备,那就是假的,否则它将是移动设备或浏览器的字符串名称(最佳猜测类似: 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>

根据 http://api.jquery.com/jQuery.browser/的官方文件:

这个属性在 jQuery 1.9中被删除,只能通过 jQuery.shift 插件使用。

您可以使用例如 jquery-migrate-1.4.1.js来保存使用 $的现有代码或插件。浏览器仍然工作,而你找到一个方法完全摆脱 $。浏览器。