在我的应用程序中,有几个按钮可以触发我的函数 loadObj(a)。该函数主要使用Three.js库加载相应的3D对象。
当我选择一个对象并单击相应的按钮时,会出现一组三个额外的按钮,这些按钮允许我加载所选对象的三个变体。以下代码已使用 addEventListener 。
对此方案有效当我选择一个不同的对象时会出现问题,这会再次触发下面的代码。然后,如果我单击新选择的对象的其中一个额外按钮,它将加载正确的对象,但它也会加载前一个对象。如果我选择第三个对象,如果我单击其中一个额外按钮,它将不会仅加载相应的对象,而是加载前两个对象。
我已经读过 addEventListener 以累积的方式工作,其中函数只是不断加起来。因此,每次运行下面的循环时,它会将新模型的新 loadObj 添加到任何其他先前的 loadObj 。
有没有办法覆盖 addEventListener 中的函数?我需要先从 addEventListener 中删除之前的 loadObj ,然后再添加新的 loadObj 。
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.11</artifactId>
<version>1.6.2</version>
</dependency>
答案 0 :(得分:1)
如果每次单击按钮时都运行该循环,则每次运行时都会添加一个事件监听器。这就是为什么每次不断获得越来越多的项目 - 你不断增加更多功能。
您可以将事件委托给父元素,而不是尝试在动态添加的按钮上动态添加新的事件侦听器,而父元素是所有按钮的直接祖先。然后你有一个单独的事件监听器,适用于所有按钮,无需任何额外的努力。您只需检查以确保点击来自正确的元素类型,然后您可以直接从该元素获取任何相关信息(通过事件对象目标上的数据或其他属性)。