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 相关文章推荐
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 Javascript
JQuery1.6 使用方法三
Nov 23 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
Dec 29 Javascript
javascript中expression的用法整理
May 13 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
Jun 09 Javascript
javascript比较两个日期相差天数的方法
Jul 24 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
Dec 13 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
Mar 02 Javascript
详解vue嵌套路由-params传递参数
May 23 Javascript
vue scroller返回页面记住滚动位置的实例代码
Jan 29 Javascript
微信小程序实现的绘制table表格功能示例
Apr 26 Javascript
vscode 插件开发 + vue的操作方法
Jun 05 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
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
在Python中使用__slots__方法的详细教程
2015/04/28 Python
Mac 上切换Python多版本
2017/06/17 Python
Python3 中文文件读写方法
2018/01/23 Python
python 对key为时间的dict排序方法
2018/10/17 Python
python numpy 按行归一化的实例
2019/01/21 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
Django日志及中间件模块应用案例
2020/09/10 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
企业门卫岗位职责
2013/12/12 职场文书
医学专业职业生涯规划范文
2014/02/05 职场文书
医院工作检讨书范文
2014/02/10 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
试了下Golang实现try catch的方法
2021/07/01 Golang
关于python中模块和重载的问题
2021/11/02 Python