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 相关文章推荐
用YUI做了个标签浏览效果
Feb 20 Javascript
推荐10个超棒的jQuery工具提示插件
Oct 11 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
Jun 05 Javascript
jquery无刷新验证邮箱地址实现实例
Feb 19 Javascript
js登录弹出层特效
Mar 07 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
Oct 25 Javascript
实例解析angularjs的filter过滤器
Dec 14 Javascript
详解Node.js开发中的express-session
May 19 Javascript
Webpack性能优化 DLL 用法详解
Aug 10 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
Sep 11 Javascript
js实现内置计时器
Dec 16 Javascript
javascript-hashchange事件和历史状态管理实例分析
Apr 18 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
php汉字转拼音的示例
2014/02/27 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
Python如何判断数独是否合法
2016/09/08 Python
快速了解Python中的装饰器
2018/01/11 Python
python实现用户答题功能
2018/01/17 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
会计自我鉴定
2014/02/04 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
2016年元旦致辞
2015/08/01 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
MySQL的索引你了解吗
2022/03/13 MySQL
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang
5个实用的JavaScript新特性
2022/06/16 Javascript