javascript - 为什么我的 Loop 事件处理程序不工作?

标签 javascript node.js

我试图将 Node 共享对象设置为触发每个 href 单击事件,但由于某些原因,只有第一个在工作。我做错了什么?

for (let i = 0; i < files.length; i++) {
    file_container.innerHTML = file_container.innerHTML + `<a id="file${i}" href="#" class="list-group-item">${files[i]}</a>`;
    document.getElementById('file' + i).onclick = (function (i) {
      require('electron').remote.getGlobal('sharedObject').filename = files[i].replace('.tnb','');
      window.location = "login.html";
    })(i);
  }

最佳答案

onclick 赋值应该接受一个函数,但您的代码所做的是(立即)执行一个函数,然后将执行结果返回给 onclick

因为你使用的是 let,它有 block 作用域,所以不需要使用 IIFE,你可以只返回一个函数作为处理程序,而不是执行它:

for (let i = 0; i < files.length; i++) {
  file_container.innerHTML = file_container.innerHTML + `<a id="file${i}" href="#" class="list-group-item">${files[i]}</a>`;
  document.getElementById('file' + i).onclick = function () { // <-- return the click handler for each element
    require('electron').remote.getGlobal('sharedObject').filename = files[i].replace('.tnb','');
    window.location = "login.html";
  };
}

正如 Alnitak 在评论中所建议的那样,使用 forEach 将创建一个单独的范围并消除对 IIFE 的需要:

files.forEach(function (file, i) {
  file_container.innerHTML = file_container.innerHTML + `<a id="file${i}" href="#" class="list-group-item">${file}</a>`;
  document.getElementById('file' + i).onclick = function () {
    require('electron').remote.getGlobal('sharedObject').filename = file.replace('.tnb','');
    window.location = "login.html";
  };
});

关于javascript - 为什么我的 Loop 事件处理程序不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40817024/

相关文章:

纯文本上的 Javascript 货币掩码

node.js - gulp 4版本问题导致所有任务失败

javascript - 使用node.js和socket.io向用户显示实时数据

javascript - 每个子列表键都是唯一的,但我仍然在控制台中收到错误。 Reactjs

node.js - 如何自定义Hapi.js访问日志?

node.js - 高性能 API 可处理许多请求

node.js - 仅在 mongoose 中的填充数组中删除文档 objectid

javascript - 在一个div中获取一个div

javascript - WebSocket : Unable to receive message at client end

javascript - 直播到浏览器