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


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 学习笔记 防止发生命名冲突
Jul 30 Javascript
js禁止document element对象选中文本实现代码
Mar 21 Javascript
javascript操纵OGNL标签示例代码
Jun 16 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
jQuery自定义滚动条完整实例
Jan 08 Javascript
jQuery实现带水平滑杆的焦点图动画插件
Mar 08 Javascript
jquery ajaxfileupload异步上传插件使用详解
Feb 08 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
Django+vue跨域问题解决的详细步骤
Jan 20 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
Apr 23 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
Apr 28 Javascript
Ant Design moment对象和字符串之间的相互转化教程
Oct 27 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文档更新介绍
2011/07/22 PHP
php适配器模式介绍
2012/08/14 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
jQuery使用post方法提交数据实例
2015/03/25 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
Python中自定义函数的教程
2015/04/27 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
应届大学生求职信
2013/12/01 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
单位委托书怎么写
2014/09/21 职场文书
婚前协议书范本
2014/10/27 职场文书
出差报告范文
2014/11/06 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android