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 null,undefined,字符串小结
Aug 21 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
Apr 07 Javascript
table对象中的insertRow与deleteRow使用示例
Jan 26 Javascript
js监听鼠标事件控制textarea输入字符串的个数
Sep 29 Javascript
jquery mobile界面数据刷新的实现方法
May 28 Javascript
Jquery实现上下移动和排序代码
Oct 17 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
Oct 21 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
Apr 14 Javascript
微信小程序中进行地图导航功能的实现方法
Jun 29 Javascript
Javascript中弹窗confirm与prompt的区别
Oct 26 Javascript
JavaScript实现多个物体同时运动
Mar 12 Javascript
JSONP解决JS跨域问题的实现
May 25 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
什么是MVC,好东西啊
2007/05/03 PHP
JS 树形递归实例代码
2010/05/18 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
kfc实习自我鉴定
2013/12/14 职场文书
财政局长自荐信范文
2013/12/22 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
小学生优秀评语
2014/12/29 职场文书
夫妻吵架保证书
2015/05/08 职场文书
怎样写家长意见
2015/06/04 职场文书
毕业赠语大全
2015/06/23 职场文书
golang中的空接口使用详解
2021/03/30 Python
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python
基于Python实现nc批量转tif格式
2022/08/14 Python