是的,我知道特征检测更可取。
我的代码库中有一个案例,我们正在使用$.browser.msie
并$.browser.version
决定是否渲染一些 CSS。写代码的开发者已经不在我们身边了,我也不完全明白应该在这里写什么样的特征检测。
作为快速修复,实现 $.browser.msie 和 $.browser.version 的最短方法是什么?
是的,我知道特征检测更可取。
我的代码库中有一个案例,我们正在使用$.browser.msie
并$.browser.version
决定是否渲染一些 CSS。写代码的开发者已经不在我们身边了,我也不完全明白应该在这里写什么样的特征检测。
作为快速修复,实现 $.browser.msie 和 $.browser.version 的最短方法是什么?
我只是从jQuery 1.8.3复制代码。
// 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;
})();
使用条件注释而不是 JavaScript。
<!--[if lte IE 7]>
<link rel="stylesheet" href="ie.css" type="text/css">
<![endif]-->
一个快速修复,以便脚本在正确重构之前不会中断(如果需要,为其他版本添加条件注释):
<!--[if IE 7]>
<script> if(typeof $!== typeof undefined){ $.browser = { msie : true, version : 7 }} </script>
<![endif]-->
<!--[if IE 8]>
<script> if(typeof $!== typeof undefined){ $.browser = { msie : true, version : 8 }} </script>
<![endif]-->
JQuery 发布了一个Migrate 插件,可以在与 1.9 一起使用时恢复 $.browser。请务必在生产服务器上使用 Migrate 的生产版本。开发版本将生成一堆控制台消息,告诉您在 1.9 无 Migrate 中您的代码会在哪里中断。
然而,使用 JQuery Migrate 来恢复 $.browser 可能不是最好的长期解决方案。顾名思义,它的目的是作为一个过渡工具,我不知道它的浏览器检测功能会被积极维护。另一种选择是Modernizr。
我个人要做的是将我的生产站点暂时保留在 JQ 1.8 上,并在我的开发机器上使用 Migrate 的开发版本进行测试,以更好地了解 1.9 会破坏什么(他们所做的远远超过在决定升级策略之前,只需删除 $.browser)。