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 相关文章推荐
线路分流自动跳转代码;希望对大家有用!
Dec 02 Javascript
FCK调用方法..
Dec 21 Javascript
简介AngularJS中$http服务的用法
Feb 06 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
Jul 17 jQuery
JavaScript对JSON数据进行排序和搜索
Jul 24 Javascript
jQuery实现可兼容IE6的遮罩功能详解
Sep 19 jQuery
vue将对象新增的属性添加到检测序列的方法
Feb 24 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
Jun 05 Javascript
详解ES6数组方法find()、findIndex()的总结
May 12 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
简单谈谈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中用文本文件做数据库的实现方法
2008/03/27 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
php学习之运算符相关概念
2011/06/09 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
javascript 闭包详解
2015/07/02 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
node.js通过url读取文件
2020/10/16 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
介绍Python中内置的itertools模块
2015/04/29 Python
Python日志模块logging基本用法分析
2018/08/23 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
土木工程毕业生自荐信
2013/11/12 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA