javascript - HTML / javascript 根据用户输入动态创建不同的消息回复
问题描述
抱歉标题令人困惑,我不太确定如何更好地命名。
无论如何,我正在处理一个在其 iframe 子级之间接收和发送数据的 postmessage 接口。它基本上发送非常简单的消息:iframe 中与游戏相关的分数或保存/加载请求。
我正在尝试做的是使用户可以使用 concat 方法一次拥有多个保存“文件”。我基本上是将单独的保存状态与一个分隔符组合成一个大字符串,并在我需要访问它们以进行加载请求时将它们分开。
以下是我目前处理来自游戏的保存请求的方式:
var states = JSON.stringify(data.gameState);
var newstate = {state: gameState};
var savesArray = savestring.split("||");
savesArray.unshift(newstate);
if (savesArray.length > 5){
savesArray.pop();
}
var state = savesArray.join("||");
然后我将“状态”发送回数据库。我遇到的问题是如何让用户决定他想要选择打开的 0-5 个保存文件中的哪一个(=> 作为加载请求发回)。
我目前正在做的一种完全避免问题的方法是使用发送第一个状态
var first_state = loaded_state.split("||")[0];
但我想知道是否有任何巧妙的方法可以在父 HTML 中收到加载请求时为用户提供按钮框/div,其中按钮决定将哪个索引保存状态发送回 iframe。我遇到的最大问题是如何正确构建按钮以动态通信和发送加载请求。
我已经有一个函数,可用于页面中的其他内容以动态创建按钮,但我不能 100% 确定我是否可以使用它来满足我的需求,或者它是否是最好的方法.
function play(name, URL) {
var element = document.createElement("button");
//Assign different attributes to the element.
element.setAttribute("value", URL);
element.setAttribute("id", "gamebutton");
element.innerHTML = name;
element.setAttribute("style", "display:block");
element.setAttribute("class", "btn btn-success btn-block");
element.onclick = function () {
document.getElementById("iframeID").src = this.getAttribute("value");
document.getElementById("iframeID").width = "95%";
document.getElementById("iframeID").height = "750 px";
document.getElementById("iframeID").style.display = "block";
document.getElementById("hiddenScore").style.display = "block";
var gameelement = document.getElementById("gamediv");
gameelement.style.display = "block";
var miscarea = document.getElementById("misc_div");
miscarea.style.display = "none";
};
我想把它做成一个模态框,但是我是否能够顺利地创建我需要的按钮的不确定性让我犹豫是否要加倍努力进行多次保存.
编辑:
这就是将消息发送回 iframe 的方式。如您所见,能够为每个索引创建按钮 (var first_state = loaded_state.split("||")[0];) 意味着所有按钮的代码都是相同的
$.ajax({
type: "GET",
url: "{% url 'get_detail_game_instance' game.pk %}",
beforeSend: function (xhr, settings) {
$.ajaxSettings.beforeSend(xhr, settings);
},
success: function (data) {
var loaded_state = JSON.parse(data.state);
var first_state = loaded_state.split("||")[0];
console.log(loaded_state);
var message = {
"messageType" : "LOAD",
"gameState" : first_state
};
event.source.postMessage(message, eventSave.origin);
},
failure: function (errMsg) {
console.log(errMsg);
}
});
事件是通过一个简单的事件监听器接收的,事件数据包含它是否是一个分数、加载或保存请求
解决方案
推荐阅读
- c++ - 在迭代错误中间向向量添加对象
- javascript - 我在电子渲染器中调用 Node 的 readFile 方法有什么问题?
- python - 从 Python 列表子集中的命名元组中检索所有命名元素
- maven - 如何在多个存储库中正确使用 Github Packages for Maven
- children - 使用 LitElement 渲染子元素(轻 DOM 和插槽)
- python - 当用户未登录时,将 Selenium Webdriver 设置为与任务计划程序一起运行?
- javascript - 遍历嵌套对象的数组,并以与值定位相同的顺序和长度从对象值创建一个新数组
- python - 我无法在 Visual Studio Code 中安装“Linter pylint”。我使用 Python 3.9
- android-studio - 带有aapt2 windows问题的Android工作室
- algorithm - 线性算法在点集中找到两个至少有一半直径距离的点