我试图将 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/