淘宝Kissy框架分析【六】
2010-06-15 21:11 BlueDream 阅读(2069) 评论(1) 编辑 收藏 举报现在开始分析kissy-ua.js 浏览器检测部分.
源码如下:
/**
* @module j1616-ua
* @author liangchaoyjs@163.com
*/
J1616.add('j1616-ua', function(J) {
var ua = navigator.userAgent,
m,
o = {
webkit: 0,
chrome: 0,
safari: 0,
gecko: 0,
firefox: 0,
ie: 0,
opera: 0,
mobile: ''
},
numberify = function(s) {
var c = 0;
return parseFloat(s.replace(/\./g, function() {
return (c++ === 0) ? '.' : '';
}));
};
// WebKit
if ((m = ua.match(/AppleWebKit\/([\d.]*)/)) && m[1]) {
o.webkit = numberify(m[1]);
// Chrome
if ((m = ua.match(/Chrome\/([\d.]*)/)) && m[1]) {
o.chrome = numberify(m[1]);
}
// Safari
if ((m = ua.match(/\/([\d.]*) Safari/)) && m[1]) {
o.safari = numberify(m[1]);
}
// Apple Mobile
if (/ Mobile\//.test(ua)) {
o.mobile = 'Apple'; // iPad, iPhone or iPod Touch
}
// Other WebKit Mobile Browsers
else if ((m = ua.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/))) {
o.mobile = m[0]; // Nokia N-series, Android, webOS, ex:NokiaN95
}
}
// NOT WebKit
else {
// Opera
if ((m = ua.match(/Opera\/.* Version\/([\d.]*)/)) && m[1]) {
o.opera = numberify(m[1]);
// Opera Mini
if ((ua.match(/Opera Mini[^;]*/))) {
o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
}
// NOT WebKit or Opera
} else {
// MSIE
if ((m = ua.match(/MSIE\s([^;]*)/)) && m[1]) {
o.ie = numberify(m[1]);
// NOT WebKit, Opera or IE
} else {
// Gecko
if ((m = ua.match(/Gecko/))) {
o.gecko = 1;
if ((m = ua.match(/rv:([\d.]*)/)) && m[1]) {
o.gecko = numberify(m[1]);
}
// Firefox
if ((m = ua.match(/Firefox\/([\d.]*)/)) && m[1]) {
o.firefox = numberify(m[1]);
}
}
}
}
}
J.UA = o;
});
* @module j1616-ua
* @author liangchaoyjs@163.com
*/
J1616.add('j1616-ua', function(J) {
var ua = navigator.userAgent,
m,
o = {
webkit: 0,
chrome: 0,
safari: 0,
gecko: 0,
firefox: 0,
ie: 0,
opera: 0,
mobile: ''
},
numberify = function(s) {
var c = 0;
return parseFloat(s.replace(/\./g, function() {
return (c++ === 0) ? '.' : '';
}));
};
// WebKit
if ((m = ua.match(/AppleWebKit\/([\d.]*)/)) && m[1]) {
o.webkit = numberify(m[1]);
// Chrome
if ((m = ua.match(/Chrome\/([\d.]*)/)) && m[1]) {
o.chrome = numberify(m[1]);
}
// Safari
if ((m = ua.match(/\/([\d.]*) Safari/)) && m[1]) {
o.safari = numberify(m[1]);
}
// Apple Mobile
if (/ Mobile\//.test(ua)) {
o.mobile = 'Apple'; // iPad, iPhone or iPod Touch
}
// Other WebKit Mobile Browsers
else if ((m = ua.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/))) {
o.mobile = m[0]; // Nokia N-series, Android, webOS, ex:NokiaN95
}
}
// NOT WebKit
else {
// Opera
if ((m = ua.match(/Opera\/.* Version\/([\d.]*)/)) && m[1]) {
o.opera = numberify(m[1]);
// Opera Mini
if ((ua.match(/Opera Mini[^;]*/))) {
o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
}
// NOT WebKit or Opera
} else {
// MSIE
if ((m = ua.match(/MSIE\s([^;]*)/)) && m[1]) {
o.ie = numberify(m[1]);
// NOT WebKit, Opera or IE
} else {
// Gecko
if ((m = ua.match(/Gecko/))) {
o.gecko = 1;
if ((m = ua.match(/rv:([\d.]*)/)) && m[1]) {
o.gecko = numberify(m[1]);
}
// Firefox
if ((m = ua.match(/Firefox\/([\d.]*)/)) && m[1]) {
o.firefox = numberify(m[1]);
}
}
}
}
}
J.UA = o;
});
这里不会源码做剖析,因为都是比较容易理解. 但现在对于UA浏览器嗅探和特性检测(如jQuery)的孰优孰劣.我认为都有其合适的应用场景.看自己的需求吧.如果需要特性检测可以参考jQuery源码.
用法:
(function(J) {
document.write(J.UA.ie + '<br/>') ;
document.write(J.UA.firefox + '<br/>');
document.write(J.UA.chrome + '<br/>');
document.write(J.UA.opera + '<br/>');
document.write(J.UA.safari + '<br/>');
})(J1616);
document.write(J.UA.ie + '<br/>') ;
document.write(J.UA.firefox + '<br/>');
document.write(J.UA.chrome + '<br/>');
document.write(J.UA.opera + '<br/>');
document.write(J.UA.safari + '<br/>');
})(J1616);
如果是目标浏览器那么会返回该浏览器的版本号.如果不是那么就返回0。
比如.你想检测浏览器是不是IE并且是IE8 就可以写 J.UA.ie && J.UA.ie === 8.
关于浏览器各大排版引擎的介绍可参考这篇文章.
至此.整个kissy文件夹的3个.js文件都分析完毕了. 接着改啃比较大块的dom文件夹了.fighting!