javascript - 在循环中将传入的值设置为事件监听器不起作用

标签 javascript svg

这感觉像是一个非常基本的问题,但我似乎找不到答案。我有一个可点击的 svg 矩形数组,其中包含 id 的“texture-1”、“texture-2”等。textureInput 数组保存这些矩形的 getElementById,在单击时调用 changeTexture() 函数。我希望当单击“texture-1”等时将“1”传递到changeTexture()函数中。

手动分配这些值是有效的:例如

  textureInput[0].addEventListener('click', function(){changeTexture("0")}, false);
  textureInput[1].addEventListener('click', function(){changeTexture("1")}, false);

但是在循环中做同样的事情不会:

for (var i=0; i<maxTextures; i++){
   textureInput[i].addEventListener('click', function(){changeTexture(i)}
};

它是否在事件时传入“i”的当前值 - 该值在循环外未定义?

最佳答案

您需要创建一个闭包,以便创建 i 变量的新副本,否则它将使用属于 for 循环的副本。试试这个:

for (var i=0; i<maxTextures; i++){
  textureInput[i].addEventListener('click', (function(i) {
    return function () {
      changeTexture(i);
    };
  })(i));
};

关于javascript - 在循环中将传入的值设置为事件监听器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32937981/

相关文章:

javascript - 刷新附加 SDK 中的 contenturl

javascript - Enjoy提示如何添加属性

javascript - jQuery Mobile 按钮未正确附加

css - SVG 动画 keySplines 和 keyTimes 不起作用

javascript - 在 html javascript 函数中调用 svg javascript 函数

javascript - Grunt Node 和 Express 本地开发 HTTPS 证书

javascript - 如何正确地从设计器的一个功能到另一个功能设置属性?

javascript - Angular2 xlink :href Issues

javascript - 如何创建一个每次单击按钮时逐渐减少 2 行不透明度的函数

javascript - 如何在不使用内联 SVG 的情况下重叠两个 SVG 向量?