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 }