javascript 处理事件绑定的一些兼容写法
作者:bea
绑定事件 代码如下: 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( 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
有用 | 无用
代码如下:
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 清空form表单中某种元素的值
- JavaScript 入门基础知识 想学习js的朋友可以参考下
- 十分钟打造AutoComplete自动完成效果代码
- jQuery 常见开发使用技巧总结
- javascript 最常用的10个自定义函数[推荐]
- javascript下利用数组缓存正则表达式的实现方法
- js 创建一个浮动div的代码
- 默认让页面的第一个控件选中的javascript代码
- js tab效果的实现代码
- javascript 计算两个整数的百分比值
- 键盘上下键移动选择table表格行的js代码
- javascript 闪烁的圣诞树实现代码
- 用Javascript同时提交多个Web表单的方法
- 再谈javascript 动态添加样式规则 W3C校检
- javascript Array对象使用小结
- javascript 键盘事件总结 推荐
- javascript 异步的innerHTML使用分析
- javascript 鼠标事件总结