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 读后台cookie代码
Sep 15 Javascript
编写兼容IE和FireFox的脚本
May 18 Javascript
JS实现来回出现文字的状态栏特效代码
Oct 31 Javascript
javascript正则表达式定义(语法)总结
Jan 08 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
Oct 08 Javascript
seajs模块之间依赖的加载以及模块的执行
Oct 21 Javascript
JQuery学习总结【二】
Dec 01 Javascript
利用Js+Css实现折纸动态导航效果实例源码
Jan 25 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
Apr 15 Javascript
jquery实现进度条状态展示
Mar 26 jQuery
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将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
php事件驱动化设计详解
2016/11/10 PHP
PHP中phar包的使用教程
2017/06/14 PHP
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
Vue实现一个图片懒加载插件
2019/03/11 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
Python实现发送与接收邮件的方法详解
2018/03/28 Python
Python实现按中文排序的方法示例
2018/04/25 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
Python 合并拼接字符串的方法
2020/07/28 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
python 写一个性能测试工具(一)
2020/10/24 Python
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
好的自荐信包括什么内容
2013/11/07 职场文书
结婚邀请函范文
2014/01/14 职场文书
超市采购员岗位职责
2014/02/01 职场文书
普通话演讲稿
2014/09/03 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
爱晚亭导游词
2015/02/09 职场文书
2016党校学习心得体会
2016/01/07 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS