(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享


Posted in Javascript onJanuary 24, 2013

跨浏览器基础事件

//跨浏览器添加事件 
function addEvent(obj, type, fn) { 
if (obj.addEventListener) { 
obj.addEventListener(type, fn, false); 
} else if (obj.attachEvent) { 
obj.attachEvent('on' + type, function () { 
fn.call(obj); 
}); 
} 
} 
//跨浏览器基础事件 
function removeEvent(obj, type, fn) { 
if (obj.removeEventListener) { 
obj.removeEventListener(type, fn, false); 
} else if (obj.detachEvent) { 
obj.detachEvent('on' + type, fn); 
} 
} 
//跨浏览器阻止默认行为 
function preDef(evt) { 
var e = evt || window.event; 
if (e.preventDefault) { 
e.preventDefault(); 
} else { 
e.returnValue = false; 
} 
} 
//跨浏览器获取目标对象 
function getTarget(evt) { 
if (evt.target) { //W3C 
return evt.target; 
} else if (window.event.srcElement) { //IE 
return window.event.srcElement; 
} 
} 
//跨浏览器获取字符编码 
function getCharCode(evt) { 
var e = evt || window.event; 
if (typeof e.charCode == 'number') { 
return e.charCode; 
} else { 
return e.keyCode; 
} 
}

浏览器检测
var client = function(){ 
//rendering engines 
var engine = { 
ie: 0, 
gecko: 0, 
webkit: 0, 
khtml: 0, 
opera: 0, 
//complete version 
ver: null 
}; 
//browsers 
var browser = { 
//browsers 
ie: 0, 
firefox: 0, 
safari: 0, 
konq: 0, 
opera: 0, 
chrome: 0, 
//specific version 
ver: null 
}; 
//platform/device/OS 
var system = { 
win: false, 
mac: false, 
x11: false, 
//mobile devices 
iphone: false, 
ipod: false, 
ipad: false, 
ios: false, 
android: false, 
nokiaN: false, 
winMobile: false, 
//game systems 
wii: false, 
ps: false 
}; 
//detect rendering engines/browsers 
var ua = navigator.userAgent; 
if (window.opera){ 
engine.ver = browser.ver = window.opera.version(); 
engine.opera = browser.opera = parseFloat(engine.ver); 
} else if (/AppleWebKit\/(\S+)/.test(ua)){ 
engine.ver = RegExp["$1"]; 
engine.webkit = parseFloat(engine.ver); 
//figure out if it's Chrome or Safari 
if (/Chrome\/(\S+)/.test(ua)){ 
browser.ver = RegExp["$1"]; 
browser.chrome = parseFloat(browser.ver); 
} else if (/Version\/(\S+)/.test(ua)){ 
browser.ver = RegExp["$1"]; 
browser.safari = parseFloat(browser.ver); 
} else { 
//approximate version 
var safariVersion = 1; 
if (engine.webkit < 100){ 
safariVersion = 1; 
} else if (engine.webkit < 312){ 
safariVersion = 1.2; 
} else if (engine.webkit < 412){ 
safariVersion = 1.3; 
} else { 
safariVersion = 2; 
} 
browser.safari = browser.ver = safariVersion; 
} 
} else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){ 
engine.ver = browser.ver = RegExp["$1"]; 
engine.khtml = browser.konq = parseFloat(engine.ver); 
} else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){ 
engine.ver = RegExp["$1"]; 
engine.gecko = parseFloat(engine.ver); 
//determine if it's Firefox 
if (/Firefox\/(\S+)/.test(ua)){ 
browser.ver = RegExp["$1"]; 
browser.firefox = parseFloat(browser.ver); 
} 
} else if (/MSIE ([^;]+)/.test(ua)){ 
engine.ver = browser.ver = RegExp["$1"]; 
engine.ie = browser.ie = parseFloat(engine.ver); 
} 
//detect browsers 
browser.ie = engine.ie; 
browser.opera = engine.opera; 
//detect platform 
var p = navigator.platform; 
system.win = p.indexOf("Win") == 0; 
system.mac = p.indexOf("Mac") == 0; 
system.x11 = (p == "X11") || (p.indexOf("Linux") == 0); 
//detect windows operating systems 
if (system.win){ 
if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)){ 
if (RegExp["$1"] == "NT"){ 
switch(RegExp["$2"]){ 
case "5.0": 
system.win = "2000"; 
break; 
case "5.1": 
system.win = "XP"; 
break; 
case "6.0": 
system.win = "Vista"; 
break; 
case "6.1": 
system.win = "7"; 
break; 
default: 
system.win = "NT"; 
break; 
} 
} else if (RegExp["$1"] == "9x"){ 
system.win = "ME"; 
} else { 
system.win = RegExp["$1"]; 
} 
} 
} 
//mobile devices 
system.iphone = ua.indexOf("iPhone") > -1; 
system.ipod = ua.indexOf("iPod") > -1; 
system.ipad = ua.indexOf("iPad") > -1; 
system.nokiaN = ua.indexOf("NokiaN") > -1; 
//windows mobile 
if (system.win == "CE"){ 
system.winMobile = system.win; 
} else if (system.win == "Ph"){ 
if(/Windows Phone OS (\d+.\d+)/.test(ua)){; 
system.win = "Phone"; 
system.winMobile = parseFloat(RegExp["$1"]); 
} 
} 
//determine iOS version 
if (system.mac && ua.indexOf("Mobile") > -1){ 
if (/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)){ 
system.ios = parseFloat(RegExp.$1.replace("_", ".")); 
} else { 
system.ios = 2; //can't really detect - so guess 
} 
} 
//determine Android version 
if (/Android (\d+\.\d+)/.test(ua)){ 
system.android = parseFloat(RegExp.$1); 
} 
//gaming systems 
system.wii = ua.indexOf("Wii") > -1; 
system.ps = /playstation/i.test(ua); 
//return it 
return { 
engine: engine, 
browser: browser, 
system: system 
}; 
}();

判断浏览器的名称、版本号、操作系统
var BrowserDetect = { 
init: function () { 
this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; 
this.version = this.searchVersion(navigator.userAgent) 
|| this.searchVersion(navigator.appVersion) 
|| "an unknown version"; 
this.OS = this.searchString(this.dataOS) || "an unknown OS"; 
}, 
searchString: function (data) { 
for (var i=0;i<data.length;i++) { 
var dataString = data[i].string; 
var dataProp = data[i].prop; 
this.versionSearchString = data[i].versionSearch || data[i].identity; 
if (dataString) { 
if (dataString.indexOf(data[i].subString) != -1) 
return data[i].identity; 
} 
else if (dataProp) 
return data[i].identity; 
} 
}, 
searchVersion: function (dataString) { 
var index = dataString.indexOf(this.versionSearchString); 
if (index == -1) return; 
return parseFloat(dataString.substring(index+this.versionSearchString.length+1)); 
}, 
dataBrowser: [ 
{ 
string: navigator.userAgent, 
subString: "Chrome", 
identity: "Chrome" 
}, 
{ string: navigator.userAgent, 
subString: "OmniWeb", 
versionSearch: "OmniWeb/", 
identity: "OmniWeb" 
}, 
{ 
string: navigator.vendor, 
subString: "Apple", 
identity: "Safari", 
versionSearch: "Version" 
}, 
{ 
prop: window.opera, 
identity: "Opera", 
versionSearch: "Version" 
}, 
{ 
string: navigator.vendor, 
subString: "iCab", 
identity: "iCab" 
}, 
{ 
string: navigator.vendor, 
subString: "KDE", 
identity: "Konqueror" 
}, 
{ 
string: navigator.userAgent, 
subString: "Firefox", 
identity: "Firefox" 
}, 
{ 
string: navigator.vendor, 
subString: "Camino", 
identity: "Camino" 
}, 
{ // for newer Netscapes (6+) 
string: navigator.userAgent, 
subString: "Netscape", 
identity: "Netscape" 
}, 
{ 
string: navigator.userAgent, 
subString: "MSIE", 
identity: "Internet Explorer", 
versionSearch: "MSIE" 
}, 
{ 
string: navigator.userAgent, 
subString: "Gecko", 
identity: "Mozilla", 
versionSearch: "rv" 
}, 
{ // for older Netscapes (4-) 
string: navigator.userAgent, 
subString: "Mozilla", 
identity: "Netscape", 
versionSearch: "Mozilla" 
} 
], 
dataOS : [ 
{ 
string: navigator.platform, 
subString: "Win", 
identity: "Windows" 
}, 
{ 
string: navigator.platform, 
subString: "Mac", 
identity: "Mac" 
}, 
{ 
string: navigator.userAgent, 
subString: "iPhone", 
identity: "iPhone/iPod" 
}, 
{ 
string: navigator.platform, 
subString: "Linux", 
identity: "Linux" 
} 
] 
}; 
BrowserDetect.init(); 
alert(BrowserDetect.browser); //名称 
alert(BrowserDetect.version); //版本 
alert(BrowserDetect.OS) //系统
Javascript 相关文章推荐
js 获取后台的字段 改变 checkbox的被选中的状态 代码
Jun 05 Javascript
JS中表单的使用小结
Jan 11 Javascript
jquery显示loading图片直到网页加载完成的方法
Jun 25 Javascript
jQuery EasyUI之DataGrid使用实例详解
Jan 04 Javascript
对javascript继承的理解
Oct 11 Javascript
JS对象深度克隆实例分析
Mar 16 Javascript
javascript实现延时显示提示框效果
Jun 01 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
解决webpack dev-server不能匹配post请求的问题
Aug 24 Javascript
vue init webpack 建vue项目报错的解决方法
Sep 29 Javascript
js实现删除li标签一行内容
Apr 16 Javascript
vue 实现tab切换保持数据状态
Jul 21 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
Jan 24 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
Jan 23 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
Jan 23 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
Jan 23 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
Jan 23 #Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
Jan 23 #Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
Jan 23 #Javascript
You might like
解析php中static,const与define的使用区别
2013/06/18 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
js实现星星打分效果
2020/07/05 Javascript
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
numpy基础教程之np.linalg
2019/02/12 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
入党思想汇报
2014/01/05 职场文书
会议邀请书范文
2014/02/02 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
民主生活会意见
2015/06/05 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL