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 相关文章推荐
JS事件Event元素(兼容IE,Firefox,Chorme)
Nov 01 Javascript
得到jQuery detach()后节点中的某个值实现代码
Feb 05 Javascript
深入浅析JavaScript中的scrollTop
Jul 11 Javascript
微信小程序 绘图之饼图实现
Oct 24 Javascript
JS对大量数据进行多重过滤的方法
Nov 04 Javascript
vue-cli 组件的导入与使用教程详解
Apr 11 Javascript
搭建基于express框架运行环境的方法步骤
Nov 15 Javascript
JavaScript实现的拼图算法分析
Feb 13 Javascript
微信小程序上传多图到服务器并获取返回的路径
May 05 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
Nov 24 Javascript
仿照Element-ui实现一个简易的$message方法
Sep 14 Javascript
nuxt 路由、过渡特效、中间件的实现代码
Nov 06 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
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
php随机显示图片的简单示例
2014/02/15 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
Python常用列表数据结构小结
2014/08/06 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
Random 在 Python 中的使用方法
2018/08/09 Python
python实现顺序表的简单代码
2018/09/28 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
季度思想汇报
2014/01/01 职场文书
五年级学生评语
2014/04/22 职场文书
应用外语系自荐信
2014/06/26 职场文书
党性观念心得体会
2014/09/03 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
护理工作个人总结
2015/03/03 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
vue3不同环境下实现配置代理
2022/05/25 Vue.js