javascript 处理事件绑定的一些兼容写法


Posted in Javascript onDecember 24, 2009

绑定事件

var addEvent = function( obj, type, fn ) { 
if (obj.addEventListener) 
obj.addEventListener( type, fn, false ); 
else if (obj.attachEvent) { 
obj["e"+type+fn] = fn; 
obj.attachEvent( "on"+type, function() { 
obj["e"+type+fn](); 
} ); 
} 
};

另一个实现
var addEvent = (function () { 
if (document.addEventListener) { 
return function (el, type, fn) { 
el.addEventListener(type, fn, false); 
}; 
} else { 
return function (el, type, fn) { 
el.attachEvent('on' + type, function () { 
return fn.call(el, window.event); 
}); 
} 
} 
})();

绑定onpropertychange事件

onpropertychange是微软制造的一个事件,它在一个元素的属性发生变化的时候触发,常见的有文本的长度改变,样长改变等,FF大致和它相似的属性为oninput事件,不过它只针对textfield与textarea的value属性。safari,firefox,chrome与 opera都支持此属性。

var addPropertyChangeEvent = function (obj,fn) { 
if(window.ActiveXObject){ 
obj.onpropertychange = fn; 
}else{ 
obj.addEventListener("input",fn,false); 
} 
}

移除事件
var removeEvent = function( obj, type, fn ) { 
if (obj.removeEventListener) 
obj.removeEventListener( type, fn, false ); 
else if (obj.detachEvent) { 
obj.detachEvent( "on"+type, obj["e"+type+fn] ); 
obj["e"+type+fn] = null; 
} 
};

加载事件
var loadEvent = function(fn) { 
var oldonload = window.onload; 
if (typeof window.onload != 'function') { 
window.onload = fn; 
}else { 
window.onload = function() { 
oldonload(); 
fn(); 
} 
} 
}

阻止事件
var stopEvent = function(e){ 
e = e || window.event; 
if(e.preventDefault) { 
e.preventDefault(); 
e.stopPropagation(); 
}else{ 
e.returnValue = false; 
e.cancelBubble = true; 
} 
}

如果仅仅是阻止事件冒泡
var stopPropagation = function(e) { 
e = e || window.event; 
if (!+"\v1") { 
e.cancelBubble = true; 
} else { 
e.stopPropagation(); 
} 
}

取得事件源对象

相当于Prototype.js框架的Event.element(e)

var getEvent = function(e){ 
e = e || window.event; 
var target = event.srcElement ? event.srcElement : event.target; 
return target 
}

或者这个功能更强大,我在开发datagrid时开发出来的,详细用法见《一步步教你实现表格排序(第二部分)》。
var getEvent = function(e) { 
var e = e || window.event; 
if (!e) { 
var c = this.getEvent.caller; 
while (c) { 
e = c.arguments[0]; 
if (e && (Event == e.constructor || MouseEvent == e.constructor)) { 
break; 
} 
c = c.caller; 
} 
} 
var target = e.srcElement ? e.srcElement : e.target, 
currentN = target.nodeName.toLowerCase(), 
parentN = target.parentNode.nodeName.toLowerCase(), 
grandN = target.parentNode.parentNode.nodeName.toLowerCase(); 
return [e,target,currentN,parentN,grandN]; 
}

最后附上DOM3.0事件的一览表
type Bubbling phase Cancelable Target node types DOM interface
DOMActivate Yes Yes Element UIEvent
DOMFocusIn Yes No Element UIEvent
DOMFocusOut Yes No Element UIEvent
focus No No Element UIEvent
blur No No Element UIEvent
textInput Yes Yes Element TextEvent
click Yes Yes Element MouseEvent
dblclick Yes Yes Element MouseEvent
mousedown Yes Yes Element MouseEvent
mouseup Yes Yes Element MouseEvent
mouseover Yes Yes Element MouseEvent
mousemove Yes Yes Element MouseEvent
mouseout Yes Yes Element MouseEvent
keydown Yes Yes Element KeyboardEvent
keyup Yes Yes Element KeyboardEvent
mousemultiwheel Yes Yes Document, Element MouseMultiWheelEvent
mousewheel Yes Yes Document, Element MouseWheelEvent
DOMSubtreeModified Yes No Document, DocumentFragment, Element, Attr MutationEvent
DOMNodeInserted Yes No Element, Attr, Text, Comment, CDATASection, DocumentType, EntityReference, ProcessingInstruction MutationEvent
DOMNodeRemoved Yes No Element, Attr, Text, Comment, CDATASection, DocumentType, EntityReference, ProcessingInstruction MutationEvent
DOMNodeRemovedFromDocument No No Element, Attr, Text, Comment, CDATASection, DocumentType, EntityReference, ProcessingInstruction MutationEvent
DOMNodeInsertedIntoDocument No No Element, Attr, Text, Comment, CDATASection, DocumentType, EntityReference, ProcessingInstruction MutationEvent
DOMAttrModified Yes No Element MutationEvent
DOMCharacterDataModified Yes No Text, Comment, CDATASection, ProcessingInstruction MutationEvent
DOMElementNameChanged Yes No Element MutationNameEvent
DOMAttributeNameChanged Yes No Element MutationNameEvent
load No No Document, Element Event
unload No No Document, Element Event
abort Yes No Element Event
error Yes No Element Event
select Yes No Element Event
change Yes No Element Event
submit Yes Yes Element Event
reset Yes Yes Element Event
resize Yes No Document, Element UIEvent
scroll Yes No Document, Element UIEvent
作者:Ruby's Louvre
Javascript 相关文章推荐
javascript中万恶的function实例分析
May 25 Javascript
兼容IE和FF的图片上传前预览js代码
May 28 Javascript
如何使Chrome控制台支持多行js模式——意外发现
Jun 13 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
详谈JavaScript 匿名函数及闭包
Nov 14 Javascript
JavaScript toUpperCase()方法使用详解
Aug 26 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
Dec 22 Javascript
js中Number数字数值运算后值不对的解决方法
Feb 28 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
Apr 19 Javascript
vue3.0生命周期的示例代码
Sep 24 Javascript
JavaScript实现栈结构详细过程
Dec 06 Javascript
Javascript 键盘keyCode键码值表
Dec 24 #Javascript
JQuery与iframe交互实现代码
Dec 24 #Javascript
jquery 弹出登录窗口实现代码
Dec 24 #Javascript
Jquery 高亮显示文本中重要的关键字
Dec 24 #Javascript
JQuery 写的个性导航菜单
Dec 24 #Javascript
JavaScript中出现乱码的处理心得
Dec 24 #Javascript
js 页面刷新location.reload和location.replace的区别小结
Dec 24 #Javascript
You might like
PHP获取文件相对路径的方法
2015/02/26 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
JavaScript 格式字符串的应用
2010/03/29 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
深入解析Python中的线程同步方法
2016/06/14 Python
利用Python爬取可用的代理IP
2016/08/18 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
python机器人运动范围问题的解答
2019/04/29 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
新闻网站实习自我鉴定
2013/09/25 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang
PHP 时间处理类Carbon
2022/05/20 PHP