Javascript 如何覆盖addEventListener中的函数?

Javascript 如何覆盖addEventListener中的函数?,javascript,delegates,addeventlistener,Javascript,Delegates,Addeventlistener,在我的应用程序中,有几个按钮触发我的函数loadObj(a)。此函数主要使用Three.js库加载相应的3D对象 当我选择一个对象并单击相应的按钮时,会出现一组三个额外的按钮,允许我加载所选对象的三个变体。下面的代码已经使用addEventListener适用于此场景 当我选择一个不同的对象时,问题就出现了,这会再次触发下面的代码。然后,如果我单击新选定对象的一个额外按钮,它将加载正确的对象,但也会加载上一个。如果我选择第三个对象,如果我单击其中一个额外按钮,它将不仅加载相应的对象,而且加载前两

在我的应用程序中,有几个按钮触发我的函数loadObj(a)。此函数主要使用Three.js库加载相应的3D对象

当我选择一个对象并单击相应的按钮时,会出现一组三个额外的按钮,允许我加载所选对象的三个变体。下面的代码已经使用addEventListener适用于此场景

当我选择一个不同的对象时,问题就出现了,这会再次触发下面的代码。然后,如果我单击新选定对象的一个额外按钮,它将加载正确的对象,但也会加载上一个。如果我选择第三个对象,如果我单击其中一个额外按钮,它将不仅加载相应的对象,而且加载前两个对象

我已经读到addEventListener是以累积的方式工作的,函数只是不断地进行相加。因此,每次运行下面的循环时,它都会添加一个新的loadObj,并将新模型的路径添加到任何其他以前的loadObj

有没有办法覆盖addEventListener中的函数?我需要在添加新的loadObj之前从addEventListener中删除以前的loadObj

    //Solve the scope/closure problem to able to call loadDress inside the "for" loop below
    function delegate(a) {
       return function(){
          loadObj(a)
       }
    }

    for(var item in paths){
       document.getElementById("size" + item).style.display = "inline-block";
       document.getElementById("size" + item).addEventListener("click", delegate(paths[item]), false);
    }

如果每次单击按钮时都运行该循环,则每次运行时都会添加一个事件侦听器。这就是为什么每次都会得到越来越多的项——不断添加更多的函数


与尝试在动态添加的按钮上动态添加新的事件侦听器不同,您可以将侦听的事件委托给作为所有按钮直接祖先的父元素。然后,您就有了一个单一的事件侦听器,它可以在无需任何额外工作的情况下为所有按钮工作。您只需检查以确保单击来自正确类型的元素,然后就可以直接从该元素获取任何相关信息(通过事件对象目标上的数据或其他属性)。

谢谢您的回复。