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
lon*_*day 68
从文档:
$ .browser属性在jQuery 1.3中已弃用,其功能可能会在未来的jQuery版本中移动到团队支持的插件中.
所以,是的,它已被弃用,但您现有的实现将继续有效.如果删除了该功能,则可以使用插件轻松访问该功能.
至于是否有替代方案......答案是"是的,可能".使用$.support而不是浏览器检测进行功能检测要好得多:检测所需的实际功能,而不是提供它的浏览器.从浏览器到浏览器的各种重要功能都会被检测到.
2013年2月16日更新:在jQuery 1.9中,此功能已被删除(docs).最好不要使用它.如果你真的必须使用它的功能,你可以使用jQuery Migrate插件恢复它.
在这里,我提出了一种基于功能可用性检测浏览器的替代方法.
要仅检测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.