1 document.addEventListener('keydown', down) 2 document.addEventListener('keyup', up) 3 var downKey = []; // 存放当前键盘按下的键 4 var timer = null; // 周期定时器,用来周期输出按下的状态 5 var type = ''; // 当前按下的类型 6 /** 7 * 判断数组是否包含元素的函数 8 * @param {Array} arr - 要判断的数组 9 * @param {Number} value - 要判断的值 10 */ 11 function _Includes (arr, value) { 12 if(arr.indexOf(value) === -1){ 13 return false; 14 } else { 15 return true; 16 } 17 } 18 /** 19 * 判断当前按下状态的函数 20 */ 21 function cd () { 22 if (downKey.length === 2) { 23 // 根据长度取出数组内所有代码进行判断 24 switch(downKey[0].toString() + downKey[1].toString()) { 25 // 按下的先后顺序不一定,所以有两种情况 26 case '3738': 27 case '3837': 28 type = '左上' 29 break; 30 case '3839': 31 case '3938': 32 type = '右上' 33 break; 34 case '3940': 35 case '4039': 36 type = '右下' 37 break; 38 case '3740': 39 case '4037': 40 type = '左下' 41 break; 42 default: 43 break; 44 } 45 } else if (downKey.length === 1) { 46 // 只按下一个键 47 switch(downKey[0].toString()) { 48 case '37': 49 type = '左' 50 break; 51 case '38': 52 type = '上' 53 break; 54 case '39': 55 type = '右' 56 break; 57 case '40': 58 type = '下' 59 break; 60 default: 61 break; 62 } 63 } 64 } 65 /** 66 * 监听按下的函数 67 * @param {Event} e - 事件 68 */ 69 function down (e) { 70 // 如果按下键的时候数组为空则开启周期计时器 71 if(downKey.length === 0){ 72 timer = setInterval(function(){ 73 console.log(type); 74 },200) 75 } 76 // 当前没按下这个键,存入按键数组 77 if (!_Includes(downKey, e.keyCode)) { 78 downKey.push(e.keyCode); 79 } 80 // 执行判断状态的函数 81 cd(); 82 } 83 /** 84 * 监听松开的函数 85 * @param {Event} e - 事件 86 */ 87 function up (e) { 88 // 松开按键的时候将其从按键数组里去掉 89 let index = downKey.indexOf(e.keyCode); 90 downKey.splice(index,1); 91 // 执行判断状态的函数 92 cd(); 93 // 若当前无按下键则清除定时器 94 if(downKey.length === 0){ 95 clearInterval(timer) 96 } 97 }