javascript - 怎么才能正确移除绑定事件??
PHP中文网
PHP中文网 2017-04-11 12:23:49
[JavaScript讨论组]

PHP中文网
PHP中文网

认证0级讲师

全部回复(4)
ringa_lee
const something = {
    bindEvent() {
        // 不管是用 function 或箭头函数封装还是 bind(this),
        // 都会产生新的函数,需要把这个新函数保存起来,这里用 this.events 来保存,
        // 方便以后移除绑定事件
        this.events = {
            mouseenter: e => this.mouseenterHandler(e),
            mouseleave: this.mouseleaveHandler.bind(this),
            click: this.clickHandler
        };

        // Array.from 可以把伪数组变成真正的数组,
        // 当然原来的 [].forEach.call 也没有什么问题
        // 不过 dot => { ... } 是箭头函数,不需要定义 self 来保存 this
        Array.from(document.querySelectorAll(".dot"))
            .forEach(dot => {
                // 这里是三句 addEventListener,
                // 直接用 Object.keys(this.events).forEach 简写了
                Object.keys(this.events)
                    .forEach(key => dot.addEventListener(key, this.events[key]));
            });
    },

    unbindEvent() {
        // 万一没调 bindEvent,this.events 会是 undefined,所以这里处理一下。
        // 其它的和 bindEvent 中的代码差不多,就不逐一解释了
        const events = this.events || {};
        Array.from(document.querySelectorAll(".dot"))
            .forEach(dot => {
                Object.keys(events)
                    .forEach(key => dot.removeEventListener(key, events[key]));
            });
    }
};
PHP中文网

bindEvent() 中,mouseenter 绑定是事件处理函数是 function(e) {self.mouseenterHandler(e)},而不是 this.mouseenterHandler,因此你的 unbindEvent() 是问题的。

阿神

function是同一个引用就行吧,你这看起来就clickHandler移除了

PHP中文网

你的绑定是匿名函数,自然解绑就是找不到的。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号