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 相关文章推荐
分页栏的web标准实现
Nov 01 Javascript
js图片延迟技术一般的思路与示例
Mar 20 Javascript
js实现字符串转日期格式的方法
May 20 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
Jun 21 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
Sep 28 Javascript
轻松理解JavaScript之AJAX
Mar 15 Javascript
JavaScript的setter与getter方法
Nov 29 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
Dec 27 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
JavaScript中.min.js和.js文件的区别讲解
Feb 13 Javascript
前端路由&amp;webpack基础配置详解
Jun 10 Javascript
Electron 调用命令行(cmd)
Sep 23 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目录操作函数之获取目录与文件的类型
2010/12/29 PHP
教你如何使用php session
2013/10/28 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
Yii学习总结之安装配置
2015/02/22 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
基于javascript实现图片预加载
2016/01/05 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
浅析Python中signal包的使用
2015/11/13 Python
人机交互程序 python实现人机对话
2017/11/14 Python
python测试mysql写入性能完整实例
2018/01/18 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
什么是反射
2012/03/17 面试题
几个Linux面试题笔试题
2016/08/01 面试题
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
人事主管岗位职责
2014/01/30 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
2015入党自传格式范文
2015/06/26 职场文书
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers