javascript - 动态生成的按钮将 onclick 事件中的变量值传递给更深的嵌套函数
问题描述
我正在为基于浏览器的游戏创建保存对话框,但遇到了一些问题。我已经保存并列出了保存,但我在加载、覆盖和删除时遇到了问题。我已经动态创建了保存条目,以及用于操作每个保存的按钮。单击任何按钮将打开一个确认对话框,单击“是”将执行实际操作。我的问题在于让每个操作在相关保存上实际运行。到目前为止,我的代码如下所示:
var saveNum, buttonType;
function loadSaveList(){
saves = JSON.parse(localStorage.getItem("game_saves"));
for(var a=0; a < saves.length; a++){
var entry = document.createElement("div");
var buttons = document.createElement("div");
var overwriteB = document.createElement("input");
var deleteB = document.createElement("input");
var loadB = document.createElement("input");
overwriteB.type = "button";
deleteB.type = "button";
loadB.type = "button";
overwriteB.onclick = function(){buttonType = 0; saveNum = function(){return a;}; saveAlert();};
deleteB.onclick = function(){buttonType = 1; saveNum = function(){return a;}; saveAlert();};
loadB.onclick = function(){buttonType = 2; saveNum = function(){return a;}; saveAlert();};
buttons.appendChild(overwriteB);
buttons.appendChild(deleteB);
buttons.appendChild(loadB);
entry.appendChild(buttons);
document.getElementById("saveEntries").appendChild(entry);}}
function saveAlert(){
switch(buttonType){
case 0:
document.getElementById("alertYes").onclick = overwriteButton;
document.getElementById("alertNo").onclick = function(){/*styling to close alert*/}; break;
case 1:
document.getElementById("alertYes").onclick = deleteButton;
document.getElementById("alertNo").onclick = function(){/*styling to close alert*/}; break;
case 2:
document.getElementById("alertYes").onclick = loadButton;
document.getElementById("alertNo").onclick = function(){/*styling to close alert*/}; break;}}
function overwriteButton(){
unloadSaveList();
saves.splice(saveNum, 1, currentSave);
localStorage.setItem("game_saves", JSON.stringify(saves));
loadSaveList();}
function deleteButton(){
unloadSaveList();
saves.splice(saveNum, 1);
localStorage.setItem("game_saves", JSON.stringify(saves));
loadSaveList();}
function loadButton(){
var tempSave = saves.slice(saveNum, saveNum+1);
currentSaveLoad(tempSave);
unloadSaveList();
saves = [];}
我的意图是用来saveNum
存储的值,a
所以底部的 3 个函数知道要对哪个保存进行操作。我认为闭包是一路获取价值的方法,但老实说,我不太确定如何以一种可行的方式实现它。我主要在 vanilla js 中寻找解决方案,但如果做不到这一点,则欢迎使用另一种解决问题的方法。
解决方案
伙计,原来我是如此接近。我做了两个小改动:
我在for循环构造函数中 var
改为:let
for(let a=0; a < saves.length; a++){
而我改为saveNum
接受a
自身的价值:
loadB.onclick = function(){buttonType = 2; saveNum = a; saveAlert();};
感谢 Hunter Frazier 为我指明了正确的方向。
推荐阅读
- javascript - 如何使用 JavaScript 将 JSON 文件从 HTML 页面发送到 ESP
- swift - 有什么方法可以在 ScrollView 中使用 SwiftUIRefresh(siteline)
- kubernetes - 仅将 Kubernetes ingress-nginx 绑定到特定地址/接口
- java - 如何获取我在 Imageview for Android Studio 上选择的图像上的图像文件名?
- node.js - Dockerizing React-Express- MongoDB Atlas 应用程序与 Docker-Compose 和代理
- c++ - MSVS/C++:不会被优化掉的最快的总是假的条件?
- html - ReactJs 中使用 ReactMapGL 的无响应页面布局
- powerbi - 在 PowerBI 免费试用帐户上安装 Analysis Services 客户端库
- python - 如何计算将训练数据和测试数据存储在两个不同的 csv 文件中的模型的 F1 分数或准确度分数?
- reactjs - How not to send information until a strong password is selected?