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


Posted in Javascript onFebruary 21, 2017

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>

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

Javascript 相关文章推荐
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
Jun 07 Javascript
Node.js实现简单聊天服务器
Jun 20 Javascript
js取得html iframe中的元素和变量值
Jun 30 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
Sep 02 Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 Javascript
JS本地刷新返回上一页代码
Jul 25 Javascript
移动端日期插件Mobiscroll.js使用详解
Dec 19 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
JavaScript同源策略和跨域访问实例详解
Apr 03 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
Apr 28 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
javascript实现异形滚动轮播
Nov 28 Javascript
简单谈谈gulp-changed插件
Feb 21 #Javascript
从零学习node.js之搭建http服务器(二)
Feb 21 #Javascript
jQuery动态生成不规则表格(前后端)
Feb 21 #Javascript
jquery设置css样式的多种方法(总结)
Feb 21 #Javascript
JavaScript中 this 指向问题深度解析
Feb 21 #Javascript
js return返回多个值,通过对象的属性访问方法
Feb 21 #Javascript
从零学习node.js之模块规范(一)
Feb 21 #Javascript
You might like
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
Python异常学习笔记
2015/02/03 Python
Python制作刷网页流量工具
2017/04/23 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
python使用正则筛选信用卡
2019/01/27 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
2019/08/07 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
Python 面向对象部分知识点小结
2020/03/09 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
建筑专业自我鉴定
2013/10/22 职场文书
军训的自我鉴定
2013/12/10 职场文书
求职自荐信的格式
2014/04/07 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
2014年双拥工作总结
2014/11/21 职场文书
申报材料格式
2014/12/30 职场文书
2016新年慰问信范文
2015/03/25 职场文书
初中语文教学随笔
2015/08/15 职场文书
合同补充协议书
2016/03/24 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL