javascript - 在处理事件监听器时,如何让 IIFE 记住变量的**每个**实例?

标签 javascript iife

我正在处理数量可能会发生变化的图像列表,因此固定 ID 和事件监听器并不实用。下面的代码使用正确的 ID 生成正确数量的按钮,但只有最后一个按钮具有功能事件监听器。

for (var i = 0; i < amount; i++) {
    !function(index) {

        if (items[index].classList.contains('current')) {
            document.getElementById('selectButtons').innerHTML += '<button id=\"bitems' + index + '\"> ⬤ <span class=\"offscreen\">Item ' + i + '</span></button>';
        } 
        else
        {
            document.getElementById('selectButtons').innerHTML += '<button id=\"bitems' + index + '\"> ◯ <span class=\"offscreen\">Item ' + i + '</span></button>';
        }

        document.getElementById('bitems' + index).addEventListener("click", function(ev) {
        alert("clicked");
        });

    }(i);
}

显然 IIFE 没有像预期的那样存储单个变量,但我不明白为什么。毕竟,这是循环中 IIFE 的全部目的。

如有任何帮助,我们将不胜感激。

最佳答案

IIFE 运行良好。实际上,每次更新 selectButtons 的 innerHTML 时,都会重新创建 DOM,并且所有附加到它的事件都消失了!

不是在每次迭代中更新 innerHTML,您可以将按钮附加到它,而不是像:

for (var i = 0; i < 10; i++) {
  !function(index) {
    var button = document.createElement("BUTTON");
    var t = document.createTextNode("Button" + index);
    button.appendChild(t);
    document.getElementById('selectButtons').appendChild(button);

    button.addEventListener("click", function(ev) {
      alert("clicked +" +index);
    });

  }(i);
}

请务必在其周围添加您需要的条件。

关于javascript - 在处理事件监听器时,如何让 IIFE 记住变量的**每个**实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41646483/

相关文章:

javascript - 如何转换非 HTML 4 实体来显示?

javascript - 尝试使用 IIFE 时未捕获类型错误

javascript - 为什么立即调用这个分组运算符+函数

Javascript 对象构造函数

javascript - 防止 iFrame 中的 HTML 退格。

javascript - 使用 iife 模式时从另一个 js 文件调用函数?

javascript - 如何将基于 IIFE 的 JavaScript 模块导入 Angular TypeScript 应用程序?

javascript - 为什么这个功能有效?每次调用该函数时, "executed"不应该返回 false 吗?

javascript - 对包含注释 block 的代码块进行注释会取消注释

javascript - 为什么我总是收到 401(未经授权)错误以防 jquery ajax