JS实现两个键盘按键同时触发的事件

做为《JS的事件处理详解》中的一个进阶练习,这一节实现两个键盘按键一起按下的时候,JS能同时响应,而不只是后按下的那个。

改进前

改进前代码如下


<html>
	<head>
		<meta charset="utf-8" />
		<script src="js/test.js" type="text/javascript" charset="utf-8">script>
		<title>title>				
	head>
	<style type="text/css">
		* {
      
			margin: 0;
			padding: 0;
		}
		p {
      
			width: 100px;
			position: relative;
		}
	style>
	<body>	
	<p>Move me!p>
	<script type="text/javascript">
		document.addEventListener('keydown',(e)=>{
      
			var event = e || window.event;
			var delta_x = 1;
			var delta_y = 1;
			var unit = 10;
			var p = document.getElementsByTagName('p')[0];
			var left = window.getComputedStyle(p,null).left;
			var top = window.getComputedStyle(p,null).top;
			switch(event.keyCode){
      
				case 37:
				delta_x=-1;
				delta_y=0;
				break;
				case 38:
				delta_x=0;
				delta_y=-1;
				break;
				case 39:
				delta_x=1;
				delta_y=0;
				break;
				case 40:
				delta_x=0;
				delta_y=1;
				break;
				default:
				delta_x=0;
				delta_y=0;
				break;
			}
			p.style.left=parseInt(left)+delta_x*unit+'px';
			p.style.top=parseInt(top)+delta_y*unit+'px';
		},false);
	script>
	body>
html>

这段代码能实现键盘的上下左右控制浏览器中文字的移动,但是如果同时按下两个方向键,例如上和右,就只会按照后按下的那个去处理。

改进后

可以配合keydownkeyup事件一起,键盘按下,设置对应移动标志位,键盘抬起,将移动标志位还原为0,然后通过定时器不停去查询移动标志位即可。

修改后的代码如下


<html>
	<head>
		<meta charset="utf-8" />
		<script src="js/test.js" type="text/javascript" charset="utf-8">script>
		<title>title>				
	head>
	<style type="text/css">
		* {
      
			margin: 0;
			padding: 0;
		}
		p {
      
			width: 100px;
			position: relative;
		}
	style>
	<body>	
	<p>Move me!p>
	<script type="text/javascript">
		var delta_x=0;
		var delta_y=0;
		document.addEventListener('keydown',(e)=>{
      
			var ev = e || window.event;
			switch(ev.keyCode){
      
				case 37:
				delta_x=-1;
				break;
				case 38:
				delta_y=-1;
				break;
				case 39:
				delta_x=1;
				break;
				case 40:
				delta_y=1;
				break;
				default:
				break;
			}
		},false);
		document.addEventListener('keyup',(e)=>{
      
			var ev = e || window.event;
			switch(ev.keyCode){
      
				case 37:
				delta_x=0;
				break;
				case 38:
				delta_y=0;
				break;
				case 39:
				delta_x=0;
				break;
				case 40:
				delta_y=0;
				break;
				default:
				break;
			}
		},false);
		var timer = window.setInterval(()=>{
      
			var unit = 10;
			var p = document.getElementsByTagName('p')[0];
			var left = window.getComputedStyle(p,null).left;
			var top = window.getComputedStyle(p,null).top;			
			p.style.left=parseInt(left)+delta_x*unit+'px';
			p.style.top=parseInt(top)+delta_y*unit+'px';
		},50);

	script>
	body>
html>

这样修改后,可以响应多个按键同时按下了,例如同时按下右和上,p标签会向右上方移动。这里设置的是50ms进行一次检测,将该值修改的越小反应越快,反之则反应越慢。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

你可能感兴趣的:(前端)