欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

javascript 组合按键事件监听实现代码

程序员文章站 2023-10-23 19:39:41
javascript 组合按键事件监听实现代码 js组合按键事件监听,支持同时监听多组按键如{a,b,c,}{ctrl,c}。 实例代码:

javascript 组合按键事件监听实现代码

js组合按键事件监听,支持同时监听多组按键如{a,b,c,}{ctrl,c}。

实例代码:

<script type="text/javascript"> 
   (function(){ 
    /** 
    *dqkeys v1.0.0 | (c) 2016 www.findme.wang 
    *@params json keys 监听的按键 
    *@params bool isorder 按键是否有相应的顺序 
    *@params function sucfuc 完成按键的回调函数 
    *@params function cancelfuc 完成按键取消后的回调函数 
    *@author lidequan 
    */ 
    var dqkeys = function(keys,isorder,sucfuc,cancelfuc) { 
      // 函数体 
      return new dqkeys.fn.init(keys,isorder,sucfuc,cancelfuc); 
    } 
    dqkeys.fn = dqkeys.prototype = { 
      'version':'1.0.0',  //版本号 
      'author':'lidequan', //作者 
      'rightkeys':{},   //监听的按键{key:code},code为按键对应的ascii码  
      'curkeys':[],    //当前按下的键 
      'sucfuc':null,    //完成按键的回调函数 
      'cancelfuc':null,  //完成按键取消后的回调函数 
      'isfinsh':false,  //判断是否完成按键 
      'isorder':false,  //按键是否有相应的顺序 
      init:function(keys,isorder,sucfuc,cancelfuc){ 
        this.rightkeys=keys; 
        this.sucfuc=sucfuc; 
        this.cancelfuc=cancelfuc; 
        this.isorder=isorder; 
          
        return this; 
      }, 
      listenkeys:function(){//监听用户键盘操作         
        var _self=this; 
        _self.addlistener('keydown', function(oevent){ 
          var oevent =oevent || window.event; 
          if(!_self.arraycontain(_self.curkeys,oevent.keycode)){ 
            if(_self.isorder && _self.getnextkey() == oevent.keycode){ 
              _self.curkeys.push(oevent.keycode); 
            }else if(!_self.isorder){ 
              _self.curkeys.push(oevent.keycode); 
            } 
          } 
          if(_self.checkresult(_self.rightkeys,_self.curkeys)){ 
            if(_self.sucfuc && !_self.isfinsh){ 
              _self.sucfuc(); 
            } 
            _self.isfinsh=true; 
          } 
        }); 
        _self.addlistener('keyup', function(oevent){ 
          var oevent =oevent || window.event;          
          if(_self.checkresult(_self.rightkeys,_self.curkeys) && _self.isfinsh){    
            //完成按键,又取消的事件 
            if(_self.cancelfuc){ 
              _self.cancelfuc(); 
            } 
          } 
  
          _self.curkey=_self.remove(_self.curkeys,oevent.keycode); 
          _self.isfinsh=false; 
        }); 
      }, 
      arraycontain:function(arr,val){//判断数组中是否包含某个元素 
          return (arr.indexof(val) == -1) ? false:true; 
      }, 
      checkresult:function(json,arr){ //判断用户是否按下监听的所有按键 
        for(var i in json){ 
           if(arr.indexof(json[i])==-1){ 
             return false; 
           } 
         } 
        return true; 
      }, 
      remove:function(arr,val) { //从数组中移除某个元素       
        var index = arr.indexof(val);  
        if (index > -1) {  
          arr.splice(index, 1);  
        }  
        return arr; 
      }, 
      getnextkey:function(){ //获取下一次按键对应的ascii码 
        for(var i in this.rightkeys){ 
          if(this.curkeys.indexof(this.rightkeys[i])==-1){ 
             return this.rightkeys[i]; 
           } 
        } 
        return null; 
      }, 
      addlistener:function(ev,fn,bool){ //事件绑定 
        if (document.attachevent) {  
          document.attachevent('on' + ev, fn);  
        }else{   
          document.addeventlistener(ev,fn,bool);  
        }  
      } 
  
    } 
    dqkeys.fn.init.prototype = dqkeys.fn; 
    window.dqkeys = window.$$= dqkeys; 
   })(); 
  
  //1.测试 
  dqkeys({'a':65,'b':66},true,function(){ 
                  console.log('okey'); 
                },function(){ 
                  console.log('cancel'); 
                }).listenkeys(); 
  
  //2.测试 
  var dqkeys=new $$({'c':67,'d':68},false,function(){ 
                  console.log('keys down '); 
                },function(){ 
                  console.log('keys cancel'); 
                }); 
  dqkeys.listenkeys(); 
  </script>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!