Darth_EF 发表于 2020-8-11 20:21:03

js&html.按键触发事件

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

/**对比两个列表项是否相同(无序)*/
function arrayCmp(CArray,keysArray){
    if(CArray&&keysArray){
      if(CArray.length!=keysArray.length)
            return false;
      var ALength=CArray.length;
      var flags=Array(ALength)
      for(var i=ALength-1;i>=0;--i){
            for(var j=ALength-1;j>=0;--j){
                if(CArray==keysArray){
                  flags=true;
                }
            }
      }
      for(var i=ALength-1;i>=0;--i){
            if(!flags)return false;
      }
      return true;
    }
}

/**按键记录器key notbook*/
function keyNB(){
    this.FElement;
    this.downingKeyCodes=[];
    this.keysdownF=[];    //function
    this.keysdownFF =[];    //function flag
    this.keysupF={};
}

keyNB.prototype={
    // 添加按键事件
    setDKeyFunc:function(keycode,func){
      if(!keycode||!func){
            return -1;
      }
      if(keycode.constructor==Number){
            this.keysdownFF.push();
      }
      else if(keycode.constructor==Array){
            this.keysdownFF.push(keycode);
      }
      this.keysdownF.push(func);
    },
   
    // 移除按键事件
    removeDKeyFunc:function(_keycode,func){
      var keycode;
      if(!_keycode||!func){
            return -1;
      }
      if(_keycode.constructor==Number){
            keycode=;
      }
      else if(_keycode.constructor==Array){
            keycode=_keycode;
      }
      for(var i=this.keysdownFF.length-1;i>=0;--i){
            if(arrayCmp(this.keysdownFF,keycode)){
                if(this.keysdownF==func){
                  this.keysdownF.splice(i,1);
                  this.keysdownFF.splice(i,1);
                  break;
                }
            }
      }
    },

    /**按下新按键*/
    setKey:function(e){
      var flag=false;
      var i=0;
      var downingKALength=this.downingKeyCodes.length;
      if(downingKALength)
      for(var j=downingKALength-1;j>=0;--j){
            if(flag)break;
            flag=e.keyCode==this.downingKeyCodes;
            i++;
      }
      if(!flag){
            // 有新的按键按下
            this.downingKeyCodes=e.keyCode;
            for(i=this.keysdownFF.length-1;i>=0;--i){
                if(arrayCmp(this.keysdownFF,this.downingKeyCodes)){
                  this.keysdownF.call(this.FElement,e);
                }
            }
      }
      else{
            for(i=this.keysdownFF.length-1;i>=0;--i){
                if(arrayCmp(this.keysdownFF,this.downingKeyCodes)&&!this.keysdownF.keepFlag){
                  this.keysdownF.call(this.FElement,e);
                }
            }
      }
    },

    /**抬起按键*/
    removeKey:function(e){
      var flag=false;
      var downingKALength=this.downingKeyCodes.length;
      if(downingKALength)
      for(var i=downingKALength-1;i>=0;--i){
            if(e.keyCode==this.downingKeyCodes){
                this.downingKeyCodes.splice(i,1);
                if(this.keysupF)this.keysupF.call(this.FElement,e);
                return 0;
            }
      }
    },
    reNB:function(){
      this.downingKeyCodes=[];
    }
}

/**
* 添加按键事件
* @param {Document} _Element
* @param {Boolean} _keepFlag 是否重复触发事件
* @param {Number||Array} _keycode 用数组表示组合键
* @param {Function} _event
* @param {Boolean} _type flase=>down;true=>up
*/
function addKeyEvent(_Element,_keepFlag,_keycode,_event,_type){
    var thisKeyNotbook;
    if(!_Element.keyNotbook){
      _Element.keyNotbook=new keyNB();
      thisKeyNotbook=_Element.keyNotbook;
      thisKeyNotbook.FElement=_Element;
      _Element.addEventListener("keydown" ,function(e){thisKeyNotbook.setKey(e)});
      _Element.addEventListener("keyup"   ,function(e){thisKeyNotbook.removeKey(e)});
      _Element.addEventListener("blur"    ,function(e){thisKeyNotbook.reNB()});
    }
    else{
      thisKeyNotbook=_Element.keyNotbook;
    }
    if(_type){
      thisKeyNotbook.keysupF=_event;
    }
    else{
      thisKeyNotbook.setDKeyFunc(_keycode,_event);
      thisKeyNotbook.keysdownF.keepFlag=_keepFlag;
    }
}

/**
* 移除按键事件
* @param {Document} _Element
* @param {Number||Array} _keycode
* @param {Function} _event
* @param {} _type flase=>down;true=>up
*/
function removeKeyEvent(_Element,_keycode,_event,_type){
    if(_Element.keyNotbook){
      var thisKeyNotbook=_Element.keyNotbook;
      if(_type){
            delete thisKeyNotbook.keysupF;
      }
      else{
            thisKeyNotbook.removeDKeyFunc(_keycode,_event);
      }
    }
}
页: [1]
查看完整版本: js&html.按键触发事件