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 相关文章推荐
javascript 复杂的嵌套环境中输出单引号和双引号
May 26 Javascript
JavaScript 基于原型的对象(创建、调用)
Oct 16 Javascript
JavaScript XML和string相互转化实现代码
Jul 04 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
javascript 获取iframe里页面中元素值的方法
Feb 17 Javascript
基于jquery实现表格内容筛选功能实例解析
May 09 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
May 27 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
Jun 01 Javascript
jQuery实现的网页换肤效果示例
Sep 20 Javascript
使用node.js实现微信小程序实时聊天功能
Aug 13 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
Aug 31 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
Apr 24 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中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
js input输入百分号保存数据库失败的解决方法
2018/05/26 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
在Django中限制已登录用户的访问的方法
2015/07/23 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
《李广射虎》教学反思
2014/04/27 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
施工安全汇报材料
2014/08/17 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL