如果语句为true,Javascript键向下一直跟踪到第二个

如果语句为true,Javascript键向下一直跟踪到第二个,javascript,Javascript,若声明为真,我如何成功地使按键保持跟踪到第二秒 这是我的剧本: document.onkeydown = KeyPressed; var TestLeftPos = 5; var Test2LeftPos = 0; function KeyPressed(k) { var TestLeftPosTrack = 0; var LeftBtn = 37; var RightBtn = 39; var UpBtn = 38; var DownBtn =

若声明为真,我如何成功地使按键保持跟踪到第二秒

这是我的剧本:

document.onkeydown = KeyPressed;

var TestLeftPos = 5;
var Test2LeftPos = 0;

function KeyPressed(k) {

    var TestLeftPosTrack = 0;

    var LeftBtn = 37;
    var RightBtn = 39;
    var UpBtn = 38;
    var DownBtn = 40;

    if (k.keyCode == RightBtn) {

        if (TestLeftPosTrack == 40) {
            Test2LeftPos = Test2LeftPos - 0.5;
            document.getElementById("TestTwo").style.left = Test2LeftPos + "vw";
        }

        else if !(TestLeftPosTrack == 40) {

        TestLeftPos = TestLeftPos + 0.5;
        TestLeftPosTrack = TestLeftPosTrack + 0.5;
        document.getElementById("Test").style.left = TestLeftPos + "vw";

        }

    }

}

但问题是,当单击右键时,它应该继续执行else语句,直到原始if语句最终正确为止。如果正确,它应该立即停止执行else语句并开始执行原始if语句,但相反,它只执行else语句,而不管原始if语句当前是否为真。如何修复此问题?

如果要将TestLeftPos和TestLeftPosTrack的增量增加到40,则只需循环即可

编辑:至于for或while循环阻止事件循环和调用堆栈,它们可以被视为反模式,因为我们正在响应事件。 相反,window.setInterval(函数,时间)更适合,这要归功于它的异步特性

document.addEventListener('onkeydown', KeyPressed);
// in case you want to break loop if key up
var breakLoop = false;
document.addEventListener('onkeyup', function(event) {
  console.log('up');
  breakLoop = true;
});

var TestLeftPos = 5;
var Test2LeftPos = 0;

function KeyPressed(k) {
  console.log('down');
  var TestLeftPosTrack = 0;

  var LeftBtn = 37;
  var RightBtn = 39;
  var UpBtn = 38;
  var DownBtn = 40;

  var test1 = document.getElementById("Test");

  if (k.keyCode === RightBtn) {
    // set the interval
    var id = window.setInterval(() => {
      if (!breakLoop && TestLeftPosTrack < 40) {
        // setting a global variable can cause bugs
        // if a second interval is called before the original interval was cleared
        // you could scope the variable properly or
        // store it in a map with the interval id as the key
        // eg.: testLeftPosMap[id] += 0.5;
        TestLeftPos = TestLeftPos + 0.5;
        TestLeftPosTrack = TestLeftPosTrack + 0.5;
        test1.style.left = TestLeftPos + "vw";
      } else {
        window.clearInterval(id);
        Test2LeftPos = Test2LeftPos - 0.5;
        document.getElementById("TestTwo").style.left = Test2LeftPos + "vw";
      }
   }, 1);
}
document.addEventListener('onkeydown',按键);
//如果你想打破循环,如果关键了
var breakLoop=false;
document.addEventListener('onkeyup',函数(事件){
console.log('up');
breakLoop=true;
});
var-TestLeftPos=5;
var Test2LeftPos=0;
功能键按下(k){
console.log('down');
var TestLeftPosTrack=0;
var-LeftBtn=37;
var-rightbn=39;
var-UpBtn=38;
var DownBtn=40;
var test1=document.getElementById(“测试”);
if(k.keyCode===rightbn){
//设定时间间隔
var id=window.setInterval(()=>{
如果(!breakLoop&&TestLeftPosTrack<40){
//设置全局变量可能会导致错误
//如果在清除原始间隔之前调用第二个间隔
//您可以正确地定义变量的范围,也可以
//将其存储在以间隔id为键的映射中
//例如:testLeftPosMap[id]+=0.5;
TestLeftPos=TestLeftPos+0.5;
TestLeftPosTrack=TestLeftPosTrack+0.5;
test1.style.left=TestLeftPos+“vw”;
}否则{
窗口。清除间隔(id);
Test2LeftPos=Test2LeftPos-0.5;
document.getElementById(“TestTwo”).style.left=Test2LeftPos+“vw”;
}
}, 1);
}

您创建一个变量
var TestLeftPosTrack=0;
然后检查
TestLeftPosTrack==40
。因此,您正在检查
0==40
是否始终为假。不清楚您试图在这里实现什么这很有趣…
否则如果!(TestLeftPosTrack==40){
为什么不直接执行
!==
?您想将TestLeftPos和TestLeftPosTrack增加0.5,直到它达到40,然后跳入TestLeftPosTrack==40 if语句?Reijo,这正是我想要做的!如果这是正确的答案,您应该接受它。