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 插件开发 extjs中的extend用法小结
Jan 04 Javascript
javascript获取当前鼠标坐标的方法
Jan 10 Javascript
javascript实现3D变换的立体圆圈实例
Aug 06 Javascript
JS调用打印机功能简单示例
Nov 28 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
Node.js使用Express.Router的方法
Nov 14 Javascript
在vue项目中引入highcharts图表的方法
Jan 21 Javascript
解决vue组件props传值对象获取不到的问题
Jun 06 Javascript
详解微信小程序中var、let、const用法与区别
Jan 11 Javascript
js实现上下左右键盘控制div移动
Jan 16 Javascript
微信小程序实现多选框功能的实例代码
Jun 24 Javascript
了不起的11个JavaScript代码重构最佳实践小结
Jan 11 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管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
2016/09/26 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
[01:44]Ti10举办地公布
2019/08/25 DOTA
Python多项式回归的实现方法
2019/03/11 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
大学校园毕业自我鉴定
2014/01/15 职场文书
英语教师自荐信
2014/05/26 职场文书
法人任命书范本
2014/06/04 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
会议简报格式范文
2015/07/20 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL
golang语言指针操作
2022/04/14 Golang
python数字图像处理:图像简单滤波
2022/06/28 Python
delete in子查询不走索引问题分析
2022/07/07 MySQL