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


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 相关文章推荐
JavaScript入门教程 Cookies
Jan 31 Javascript
Ext JS添加子组件的误区探讨
Jun 28 Javascript
判断文档离浏览器顶部的距离的方法
Jan 08 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
Aug 28 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
Dec 08 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
Sep 17 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
Sep 27 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
Jul 03 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 Javascript
vue.js中实现登录控制的方法示例
Apr 23 Javascript
详解JavaScript函数callee、call、apply的区别
Mar 08 Javascript
6种JavaScript继承方式及优缺点(小结)
Feb 06 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
以文本方式上传二进制文件的PHP程序
2006/10/09 PHP
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
php session的锁和并发
2016/01/22 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
PHP中phar包的使用教程
2017/06/14 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
JavaScript中的Location地址对象
2008/01/16 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
js 通用订单代码
2013/12/23 Javascript
Jquery性能优化详解
2014/05/15 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
详解JavaScript的变量
2019/04/04 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
Python探索之pLSA实现代码
2017/10/25 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
python unichr函数知识点总结
2020/12/16 Python
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
见习期自我鉴定
2013/11/07 职场文书
家长会标语
2014/06/24 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
答谢酒会主持词
2015/07/02 职场文书
神州牡丹园的导游词
2019/11/20 职场文书