当同一个对象使用.onclick的写法触发多个方法的时候,后一个方法会把前一个方法覆盖掉。而用addEventListener事件监听则不会有覆盖的现象,支持多重加载与冒泡捕获,每个绑定的事件都会被执行。
```
// onclick绑定事件
window.onload = function() {
var btn = document.getElementById("yuanEvent");
btn.onclick = function() {
alert("第一个事件");
};
btn.onclick = function() {
alert("第二个事件");
}
};
// addEventListener绑定事件
var eventOne = function() {
alert("第一个监听事件");
}
function eventTwo() {
alert("第二个监听事件");
}
window.onload = function() {
var btn = document.getElementById("yuanEvent");
// addEventListener:绑定函数
btn.addEventListener("click", eventOne);
btn.addEventListener("click", eventTwo);
// removeEventListener:取消绑定
btn.removeEventListener("click",eventOne);
}
```
解决onClick的写法触发后一个方法会把前一个方法覆盖的问题。
```
//统计添加事件监听的个数,0作为预留位
var eventHandlesCounter = 1;
function addEvent(obj, evt, fn) {
if(!fn.__EventID) {
fn.__EventID = eventHandlesCounter++;
}
if(!obj.__EventHandles) {
obj.__EventHandles = [];
}
if(!obj.__EventHandles[evt]) {
obj.__EventHandles[evt] = [];
// 这里记录已经使用onClick直接绑定的事件
if(obj["on" + evt] instanceof Function) {
obj["on" + evt].__EventID = 0;
obj.__EventHandles[evt][0] = obj["on" + evt];
}
obj["on" + evt] = handleEvents;
}
obj.__EventHandles[evt][fn.__EventID] = fn;
function handleEvents() {
var fns = obj.__EventHandles[evt];
for (var i = 0; i < fns.length; i++) {
if(fns[i] instanceof Function) {
fns[i].call(this);
}
}
}
}
function delEvent(obj, evt, fn) {
if(!obj.__EventHandles || !obj.__EventHandles[evt] || !fn.__EventID){
return false;
}
if(obj.__EventHandles[evt][fn.__EventID] == fn){
delete obj.__EventHandles[evt][fn.__EventID];
}
}
```
网友评论