美文网首页
同一事件有多个监听方法,可分别删除监听方法

同一事件有多个监听方法,可分别删除监听方法

作者: zhulichao | 来源:发表于2020-07-24 09:05 被阅读0次

当同一个对象使用.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];
    }
}
```

相关文章

网友评论

      本文标题:同一事件有多个监听方法,可分别删除监听方法

      本文链接:https://www.haomeiwen.com/subject/jgfjhktx.html