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

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

作者: 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