按下键时循环一个函数

Bla*_*ndo 4 html javascript loops onkeypress onkeydown

我正在尝试使用 Javascript 中的两个键上下移动 div。这个想法是,当按下某个键时,一个函数会循环并每次添加到 div 的“顶部”样式值。基本功能有效,但我无法让它循环,也无法响应按键。

很难在 Javascript 中找到有关按键处理的信息,似乎大多数人使用 jQuery 来处理。

我对 do-while 循环的使用是否正确?有没有更好的方法来处理 keydown 和 keyup 事件?

这是我的代码:

var x = 0;
console.log(x);

function player1MoveDown() {
            var value = document.getElementById("player1").style.top;
            value = value.replace("%", "");
            value = parseInt(value);
            value = value + 1;
            value = value + "%";
            document.getElementById("player1").style.top = value;
            console.log(value);
        }    //moves paddle down; adds to paddle's 'top' style value

function player1MoveSetting() {
    x = 1;
    do {
        setInterval(player1MoveDown(), 3000);
    }   
    while (x == 1);
    console.log(x);
} //paddle moves while x=1; runs player1MoveDown function every 3 seconds

 function player1Stop() {
    x = 0;
 }
Run Code Online (Sandbox Code Playgroud)

这是 HTML 的相关部分:

<div class="paddle" id="player1" style="top:1%" onkeydown="player1MoveSetting()" onkeyup="player1Stop()"></div>

Ric*_*ock 6

您不能将 keydown 事件附加到 a div,除非它具有tabindex

<div class="paddle" id="player1" 
     onkeydown="player1MoveSetting()"
     onkeyup="player1Stop()"
     tabindex="1"
>
</div>
Run Code Online (Sandbox Code Playgroud)


您可以替换所有这些代码:

var value = document.getElementById("player1").style.top;
value = value.replace("%", "");
value = parseInt(value);
value = value + 1;
value = value + "%";
document.getElementById("player1").style.top = value;
Run Code Online (Sandbox Code Playgroud)

… 有了这个:

var p1= document.getElementById('player1');
p1.style.top= parseInt(p1.style.top)+1+'%';
Run Code Online (Sandbox Code Playgroud)


这调用了 的返回结果player1MoveDown

setInterval(player1MoveDown(), 3000);
Run Code Online (Sandbox Code Playgroud)

由于player1MoveDown不返回任何内容,因此相当于

setInterval(null, 3000);
Run Code Online (Sandbox Code Playgroud)

要每 3 秒调用一次该函数,请改为执行以下操作:

setInterval(player1MoveDown, 3000);
Run Code Online (Sandbox Code Playgroud)


这将创建一个无限循环:

x = 1;
do {
  setInterval(player1MoveDown, 3000);
}   
while (x == 1);
Run Code Online (Sandbox Code Playgroud)

即使keyup将全局设置x为 0,它也永远不会运行,因为循环永远不会结束。

相反,创建一个timer变量,该变量在 上设置keydown和清除keyup


完整的 JavaScript 代码

var timer;

function player1MoveDown() {
  var p1= document.getElementById('player1');
  p1.style.top= parseInt(p1.style.top)+1+'%';
  console.log(p1.style.top);
}

function player1MoveSetting() {
  if(timer) return;
  timer= setInterval(player1MoveDown, 100);
}

function player1Stop() {
  clearInterval(timer);
  timer= null;
}

document.getElementById('player1').focus();
Run Code Online (Sandbox Code Playgroud)

工作小提琴