鱼C论坛

 找回密码
 立即注册
查看: 1907|回复: 0

[作品展示] js&html.按键触发事件

[复制链接]
发表于 2020-8-11 20:21:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
非常简单的一个东西,但是太菜了所以写得比较臃肿。

  1. /**对比两个列表项是否相同(无序)*/
  2. function arrayCmp(CArray,keysArray){
  3.     if(CArray&&keysArray){
  4.         if(CArray.length!=keysArray.length)
  5.             return false;
  6.         var ALength=CArray.length;
  7.         var flags=Array(ALength)
  8.         for(var i=ALength-1;i>=0;--i){
  9.             for(var j=ALength-1;j>=0;--j){
  10.                 if(CArray[i]==keysArray[j]){
  11.                     flags[i]=true;
  12.                 }
  13.             }
  14.         }
  15.         for(var i=ALength-1;i>=0;--i){
  16.             if(!flags[i])return false;
  17.         }
  18.         return true;
  19.     }
  20. }

  21. /**按键记录器key notbook*/
  22. function keyNB(){
  23.     this.FElement;
  24.     this.downingKeyCodes=[];
  25.     this.keysdownF  =[];    //function
  26.     this.keysdownFF =[];    //function flag
  27.     this.keysupF={};
  28. }

  29. keyNB.prototype={
  30.     // 添加按键事件
  31.     setDKeyFunc:function(keycode,func){
  32.         if(!keycode||!func){
  33.             return -1;
  34.         }
  35.         if(keycode.constructor==Number){
  36.             this.keysdownFF.push([keycode]);
  37.         }
  38.         else if(keycode.constructor==Array){
  39.             this.keysdownFF.push(keycode);
  40.         }
  41.         this.keysdownF.push(func);
  42.     },
  43.    
  44.     // 移除按键事件
  45.     removeDKeyFunc:function(_keycode,func){
  46.         var keycode;
  47.         if(!_keycode||!func){
  48.             return -1;
  49.         }
  50.         if(_keycode.constructor==Number){
  51.             keycode=[_keycode];
  52.         }
  53.         else if(_keycode.constructor==Array){
  54.             keycode=_keycode;
  55.         }
  56.         for(var i=this.keysdownFF.length-1;i>=0;--i){
  57.             if(arrayCmp(this.keysdownFF[i],keycode)){
  58.                 if(this.keysdownF[i]==func){
  59.                     this.keysdownF.splice(i,1);
  60.                     this.keysdownFF.splice(i,1);
  61.                     break;
  62.                 }
  63.             }
  64.         }
  65.     },

  66.     /**按下新按键*/
  67.     setKey:function(e){
  68.         var flag=false;
  69.         var i=0;
  70.         var downingKALength=this.downingKeyCodes.length;
  71.         if(downingKALength)
  72.         for(var j=downingKALength-1;j>=0;--j){
  73.             if(flag)break;
  74.             flag=e.keyCode==this.downingKeyCodes[j];
  75.             i++;
  76.         }
  77.         if(!flag){
  78.             // 有新的按键按下
  79.             this.downingKeyCodes[i]=e.keyCode;
  80.             for(i=this.keysdownFF.length-1;i>=0;--i){
  81.                 if(arrayCmp(this.keysdownFF[i],this.downingKeyCodes)){
  82.                     this.keysdownF[i].call(this.FElement,e);
  83.                 }
  84.             }
  85.         }
  86.         else{
  87.             for(i=this.keysdownFF.length-1;i>=0;--i){
  88.                 if(arrayCmp(this.keysdownFF[i],this.downingKeyCodes)&&!this.keysdownF.keepFlag){
  89.                     this.keysdownF[i].call(this.FElement,e);
  90.                 }
  91.             }
  92.         }
  93.     },

  94.     /**抬起按键*/
  95.     removeKey:function(e){
  96.         var flag=false;
  97.         var downingKALength=this.downingKeyCodes.length;
  98.         if(downingKALength)
  99.         for(var i=downingKALength-1;i>=0;--i){
  100.             if(e.keyCode==this.downingKeyCodes[i]){
  101.                 this.downingKeyCodes.splice(i,1);
  102.                 if(this.keysupF[e.keyCode.toString()])this.keysupF[e.keyCode.toString()].call(this.FElement,e);
  103.                 return 0;
  104.             }
  105.         }
  106.     },
  107.     reNB:function(){
  108.         this.downingKeyCodes=[];
  109.     }
  110. }

  111. /**
  112. * 添加按键事件
  113. * @param {Document} _Element
  114. * @param {Boolean} _keepFlag 是否重复触发事件
  115. * @param {Number||Array} _keycode 用数组表示组合键
  116. * @param {Function} _event
  117. * @param {Boolean} _type flase=>down;true=>up
  118. */
  119. function addKeyEvent(_Element,_keepFlag,_keycode,_event,_type){
  120.     var thisKeyNotbook;
  121.     if(!_Element.keyNotbook){
  122.         _Element.keyNotbook=new keyNB();
  123.         thisKeyNotbook=_Element.keyNotbook;
  124.         thisKeyNotbook.FElement=_Element;
  125.         _Element.addEventListener("keydown" ,function(e){thisKeyNotbook.setKey(e)});
  126.         _Element.addEventListener("keyup"   ,function(e){thisKeyNotbook.removeKey(e)});
  127.         _Element.addEventListener("blur"    ,function(e){thisKeyNotbook.reNB()});
  128.     }
  129.     else{
  130.         thisKeyNotbook=_Element.keyNotbook;
  131.     }
  132.     if(_type){
  133.         thisKeyNotbook.keysupF[_keycode.toString()]=_event;
  134.     }
  135.     else{
  136.         thisKeyNotbook.setDKeyFunc(_keycode,_event);
  137.         thisKeyNotbook.keysdownF[thisKeyNotbook.keysdownF.length-1].keepFlag=_keepFlag;
  138.     }
  139. }

  140. /**
  141. * 移除按键事件
  142. * @param {Document} _Element
  143. * @param {Number||Array} _keycode
  144. * @param {Function} _event
  145. * @param {} _type flase=>down;true=>up
  146. */
  147. function removeKeyEvent(_Element,_keycode,_event,_type){
  148.     if(_Element.keyNotbook){
  149.         var thisKeyNotbook=_Element.keyNotbook;
  150.         if(_type){
  151.             delete thisKeyNotbook.keysupF[_keycode.toString()];
  152.         }
  153.         else{
  154.             thisKeyNotbook.removeDKeyFunc(_keycode,_event);
  155.         }
  156.     }
  157. }
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 18:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表