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 相关文章推荐
js arguments,jcallee caller用法总结
Nov 30 Javascript
jquery中each方法示例和常用选择器
Jul 08 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
javascript中Date format(js日期格式化)方法小结
Dec 17 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
jQuery复合事件结合toggle()方法的用法示例
Jun 10 jQuery
详解Angular如何正确的操作DOM
Jul 06 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
Sep 18 Javascript
Vue核心概念Action的总结
Jan 18 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
Jul 22 Javascript
vue基于better-scroll实现左右联动滑动页面
Jun 30 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安装攻略:常见问题解答(三)
2006/10/09 PHP
目录,文件操作详谈―PHP
2006/11/25 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
零基础学JavaScript最新动画教程+iso光盘下载
2008/01/22 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
Javascript实现计算个人所得税
2015/05/10 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
Python面向对象编程基础解析(二)
2017/10/26 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
Python imutils 填充图片周边为黑色的实现
2020/01/19 Python
Python实现代码块儿折叠
2020/04/15 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
详解HTML5新增标签
2017/11/27 HTML / CSS
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
文明村创建实施方案
2014/03/27 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
Python使用openpyxl批量处理数据
2021/06/23 Python
Python采集股票数据并制作可视化柱状图
2022/04/04 Python
详解CSS3浏览器兼容
2022/12/24 HTML / CSS