我需要修改一些旧的JavaScript代码。有一个地方,我想等到用户按下两个按钮之一,然后继续程序流程(如prompt()
功能)。如何实现这一目标?
答案 0 :(得分:3)
您需要在此时断开您的功能,并添加另一个功能来捕捉用户的按钮按下事件。
您可以使用Narrative Javascript来引入阻止行为并简化它(因此您不需要将功能分解为两部分),但请注意,自2013年以来该库已被放弃。
答案 1 :(得分:3)
好的,可能你想要这种东西,你可以实现事件来标记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()方法,但我做了它,这样你就可以查看发生了什么。 对不起这个例子中的混乱,但我没有太多时间可以利用:)
答案 2 :(得分:2)
只需创建一个Promise,并将resolve函数超出其作用域存储在全局变量中。然后,让程序等待承诺解决(使用“异步”和“等待”)。通过调用该全局变量,可在单击按钮时解决承诺。我在国际象棋程序中使用了此技术,等待升级弹出窗口的答案:
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";
(...)
}
因此,在创建承诺后,程序将等待直到弹出窗口将其解决为止。弹出窗口在关闭后会按以下方式解决诺言:
_promote(type); /* resolve promotion-promise */
请记住,在这种情况下,还必须使用“ await”关键字来调用promote_piece()函数!否则,程序将异步执行并继续执行
答案 3 :(得分:0)
答案 4 :(得分:0)
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>
答案 5 :(得分:0)
我不会为此超时和间隔。
你最好分两部分切割程序,可能就像你在2个功能中所建议的那样 运行第一部分,添加代码以要求用户采取行动。
然后根据动作,运行第二部分。