我需要修改一些遗留的 javascript 代码。有一个地方我想等到用户按下两个按钮之一,然后继续程序流程(如prompt()
函数)。如何实现?
6 回答
只需创建一个 Promise 并将 resolve 函数存储在其范围之外的全局变量中。然后让程序等待 promise 解决(使用“async”和“await”)。通过调用该全局变量,通过单击按钮来解决承诺。我在国际象棋程序中使用了这种技术来等待升级弹出窗口的答案:
var _promote; /* resolve-function reference */
async function promote_piece(pce, fld, clr) {
var type;
(...)
show_mpw(clr); /* show modal promotion window */
var promise = new Promise((resolve) => { _promote = resolve });
await promise.then((result) => { type = result });
if (type === undefined) type = "Q";
(...)
}
所以在创建promise之后,程序会等到弹出窗口解决它。弹出窗口在关闭时按如下方式解析承诺:
_promote(type); /* resolve promotion-promise */
注意 请记住,在这种情况下,promote_piece() 函数本身也必须使用“await”关键字调用!否则程序将异步执行并继续
您需要在此时打破您的功能,并添加另一个功能来捕捉用户的按钮按下事件。
您可以使用Narrative Javascript来引入阻塞行为并对其进行简化(因此您无需将函数分成两部分),但请注意,该库自 2013 年以来已被废弃。
好的,可能你想要这种东西,你可以实现事件来标记 Pentium10 的答案中的密钥:
您可以创建一个名为 waitForIt() 的函数,在其中设置一个 setTimeout() 函数,该函数调用相同的方法,直到全局变量为真(通过按下按钮操作设置)。
例如:
<html>
<head>
<script type="text/javascript">
var buttonpressed = false;
function waitForIt() {
if (!buttonpressed ) {
setTimeout(waitForIt,2500);
} else {
document.getElementById('info').value='ok';
}
}
function startSomething() {
document.getElementById('info').value='';
waitForIt();
document.getElementById('info').value='waiting';
}
function setButtonPressed() {
buttonpressed = true;
}
</script>
</head>
<body>
<br>
<input type='text' style="width: 200px;" id="info" />
<br>
<input type='button' style="width: 200px;" value="Start" onclick="javascript: startSomething();">
<br>
<br>
<input type='button' style="width: 200px;" value="Continue" onclick="javascript: setButtonPressed();">
</body>
</html>
您可以直接调用 waitForIt() 方法,但我这样做是为了让您可以查看正在发生的事情。对不起示例中的混乱,但我没有太多时间空闲:)
- 您可以隐藏可能不可见的内容(使用 CSS display:none)并在您按下按钮时显示它。
- 或更安全:您可以在按下按钮时发出服务器/AJAX 请求
JavaScript 中没有“睡眠”或“等待”运算符。不过,您可以设置一个计时器,当计时器到期时,它将执行一个函数。
setTimeout("alert('hello')",1250);
您必须使用事件来标记密钥:
<script type="text/javascript">
document.onkeyup = KeyCheck;
function KeyCheck()
{
var KeyID = event.keyCode;
switch(KeyID)
{
case 16:
document.Form1.KeyName.value = "Shift";
break;
case 17:
document.Form1.KeyName.value = "Ctrl";
break;
case 18:
document.Form1.KeyName.value = "Alt";
break;
case 19:
document.Form1.KeyName.value = "Pause";
break;
case 37:
document.Form1.KeyName.value = "Arrow Left";
break;
case 38:
document.Form1.KeyName.value = "Arrow Up";
break;
case 39:
document.Form1.KeyName.value = "Arrow Right";
break;
case 40:
document.Form1.KeyName.value = "Arrow Down";
break;
}
}
</script>
我不会为此玩超时和间隔。
您最好将程序分成两部分,可能就像您在 2 个功能中建议的那样。
运行第一部分,添加代码以要求用户采取行动。
然后根据动作,运行第二部分。