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

@H_403_0@

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


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


@H_403_0@实例代码


<div class="jb51code">
<pre class="brush:js;">
<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,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,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(){ //<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>下一次按键对应的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,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();

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

相关文章

事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数...
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言...
什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源...
@ &quot;TOC&quot; 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是须知的必须有...
搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图, :视图模...
首先我们需要一个html代码的框架如下: 我们的目的是实现ul中的内容进行横向的一点一点滚动。ul中的内容...