javascript - 如何删除匿名函数中的EventListener?

标签 javascript

我正在尝试使用 removeEventListener 但与 event.target.removeEventListener('click', myName, false); 一致是错误的。我尝试了不同的方法,但没有一个有效。

document.querySelector('#imagesContainer').addEventListener('click', function myName (event) {

    var images = this.formData.getAll('images[]');

    var picName = event.target.parentNode.dataset.name;

    var id = event.target.parentNode.getAttribute('id');
    var xxx = document.getElementById(id);
    xxx.outerHTML = "";

    delete xxx;

    for (var n = 0; n < images.length; n++) {
        if (images[n].name == picName) {
            var removedObject = images.splice(n, 1);
            removedObject = null;
            break;
        }
    }

    this.formData.delete('images[]');
    [].forEach.call(images, function(image){
        this.formData.append('images[]', image);
    }.bind(this));

    event.target.removeEventListener('click', myName, false);

}.bind(this), false);

最佳答案

因为您在 function myName.bind(this) - 绑定(bind)创建了一个新函数,因此传递给点击处理程序的函数不是 myName ,它是绑定(bind)到 this 的 myName - 但您不能简单地将 .bind(this) 添加到删除代码,因为那将是不同的 myName与此绑定(bind)

一种解决方案是使用 IIFE 将 this“捕获”为 _this,然后使用 _this 而不是 this 在您的代码中:例如

document.querySelector('#imagesContainer').addEventListener('click', (function(_this) {
    return function myName (event) {
        // replace this with _this
        var images = _this.formData.getAll('images[]');
        var picName = event.target.parentNode.dataset.name;

        var id = event.target.parentNode.getAttribute('id');
        var xxx = document.getElementById(id);
        xxx.outerHTML = "";

        delete xxx;

        for (var n = 0; n < images.length; n++) {
            if (images[n].name == picName) {
                var removedObject = images.splice(n, 1);
                removedObject = null;
                break;
            }
        }

        _this.formData.delete('images[]');
        [].forEach.call(images, function(image){
            _this.formData.append('images[]', image);
        }.bind(_this));

        // here you can use this, because this will be the element that fired the click event
        this.removeEventListener('click', myName, false);
    };
}(this)), false);

关于javascript - 如何删除匿名函数中的EventListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41708152/

相关文章:

javascript - 将具有相同表单的新项目添加到现有 session 存储中

javascript - requestAnimationFrame 不等待下一帧

javascript - 当谷歌地图标记点移动时用经纬度更新数据库

javascript - ajax post 整数和字符串数组

javascript - Bootstrap 模态未正确显示

javascript - 如何使用jquery确保所有内容都加载到ajax中

javascript - 如何保存来自 jQuery 的 css 更改

带有 html 的 javascript 用于粘滞便笺

javascript - 将 react-spring useSprings 与动态项目数组一起使用

javascript - ASP.NET MVC3 : Why are my custom validation attributes never working?