9

我需要修改一些遗留的 javascript 代码。有一个地方我想等到用户按下两个按钮之一,然后继续程序流程(如prompt()函数)。如何实现?

4

6 回答 6

8

只需创建一个 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”关键字调用!否则程序将异步执行并继续

于 2019-11-11T22:00:44.020 回答
4

您需要在此时打破您的功能,并添加另一个功能来捕捉用户的按钮按下事件。

您可以使用Narrative Javascript来引入阻塞行为并对其进行简化(因此您无需将函数分成两部分),但请注意,该库自 2013 年以来已被废弃。

于 2010-02-08T13:36:06.657 回答
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() 方法,但我这样做是为了让您可以查看正在发生的事情。对不起示例中的混乱,但我没有太多时间空闲:)

于 2010-02-08T13:54:41.730 回答
0
  • 您可以隐藏可能不可见的内容(使用 CSS display:none)并在您按下按钮时显示它。
  • 或更安全:您可以在按下按钮时发出服务器/AJAX 请求
于 2010-02-08T13:32:14.937 回答
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>
于 2010-02-08T13:32:56.630 回答
0

我不会为此玩超时和间隔。

您最好将程序分成两部分,可能就像您在 2 个功能中建议的那样。
运行第一部分,添加代码以要求用户采取行动。

然后根据动作,运行第二部分。

于 2010-02-08T19:47:58.663 回答