javascript - 按住时 KeyDown 不会连续触发

标签 javascript jquery keydown jquery-events

我有这个Plunkr ,

其中包含一个 div,我在其上绑定(bind)了一个 keydown 事件。按向右或向左箭头时,div 应该开始移动。

这在所有浏览器中都有效,但是当按住时,会立即触发第一个 keydown 事件(div 移动一次),并等待一段时间,然后继续移动。

因此,这意味着 keydown 事件一旦触发,浏览器就会等待检测是否还有后续的 keyUp 事件,然后在很短的时间后(当没有 keyup),它继续触发 keydown 事件。

(要查看问题,请将焦点放在窗口上,按向右箭头并按住,div 应移动一次 5px,然后等待,然后再次继续移动)

问题:有没有办法解决,这样我就可以按住按键,div 应该立即开始移动,而无需等待检测后续的 keyup(一次)?

$(function() {
  $(window).keydown(function(e) {
    console.log(e.keyCode)
    if (e.keyCode == 39)
      move(5, 'left', $('.mover'))
    else if (e.keyCode == 37)
      move(-5, 'left', $('.mover'))
  })

})

function move(offset, direction, target) {
  console.log($(target))
  $(target).css(direction, (parseInt($(target).css(direction)) + offset) + 'px')
}
.mover {
  height: 50px;
  width: 50px;
  display: inline-block;
  background: black;
  position: absolute;
  left: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class='mover'></div>

最佳答案

我会建议一些关于超时的事情,就像这样

http://codepen.io/kevrowe/pen/qEgGVO

$(function() {
  var direction,
      movingTimeout = -1;

  $(window).on('keydown', function(e) {    
    if (e.keyCode == 39) {
      direction = 'right';
    } else if (e.keyCode == 37) {
      direction = 'left';
    }  

    startMoving(direction);
  });

  function stopMoving() {
    clearTimeout(movingTimeout);
    movingTimeout = -1;
  }

  function startMoving(direction) {
    if (movingTimeout === -1) {      
      loop(direction);
    }
  }

  function loop(direction) {
    move(direction === 'left' ? -5 : 5, $('.mover'));
    movingTimeout = setTimeout(loop, 10, direction);
  }

  function move(offset, $target) {
    $target.css('left', (parseInt($target.css('left')) + offset) + 'px')
  }

  $(window).on('keyup', function(e) {    
    stopMoving();
  });
})

关于javascript - 按住时 KeyDown 不会连续触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29279805/

相关文章:

javascript - React中的RBAC,如何实现,构想?

javascript - 带有 Css 的 float 标签在边缘、Internet Explorer 中不起作用

jquery - Css 和 Jquery 在对话框中无法正常工作

javascript - 将数组中的变量替换为循环中的数据

jquery - 如何不允许使用 jQuery 在文本输入字段中输入内容?

javascript - 使用 jQuery 设置 <option> 元素的文本

javascript - 刷新 Angular 中自定义属性指令的元素

javascript - 背景位置 : fixed

javascript - 如何防止某些事件的按键默认设置,然后再次恢复默认设置

javascript - 如何在触发 keyup 后继续 keydown 事件