本文汇总了JavaScript中处理事件绑定的多种兼容写法,涵盖标准addEventListener与IE特有的attachEvent实现。详细解析了onpropertychange与input事件的差异、事件移除、加载及阻止冒泡的具体代码实现,并提供了获取事件源对象的进阶方法。文末附带完整的DOM3.0事件一览表,供开发者参考使用。
事件绑定基础实现
事件绑定
代码如下:
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 与 input 事件处理
处理 onpropertychange 事件
onpropertychange 是微软引入的一个事件,当元素属性发生变化时触发,例如文本长度或样式的改变。Firefox 中类似的事件为 oninput,但它仅针对 textfield 和 textarea 的 value 属性。Safari、Firefox、Chrome 与 Opera 均支持 oninput 属性。
代码如下:
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 事件一览表
最后附上 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