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中万恶的function实例分析
May 25 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
一个仿糯米弹框效果demo
Jul 22 Javascript
在JavaScript中正确引用bind方法的应用
May 11 Javascript
JS中产生标识符方式的演变
Jun 12 Javascript
JQuery 又谈ajax局部刷新
Nov 27 jQuery
js 将canvas生成图片保存,或直接保存一张图片的实现方法
Jan 02 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
Dec 09 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
Apr 28 Javascript
javascript中如何判断类型汇总
May 14 Javascript
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
简单谈谈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性能优化准备篇图解PEAR安装
2011/12/05 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
javascript类继承机制的原理分析
2009/09/12 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
jquery选择器简述
2015/08/31 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
JS实现超级好看的鼠标小尾巴特效
2020/12/01 Javascript
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python阶乘求和的代码详解
2020/02/14 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
Python如何实现邮件功能
2020/05/27 Python
keras slice layer 层实现方式
2020/06/11 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
2014年高三班主任工作总结
2014/12/05 职场文书
应届毕业生自荐信
2015/03/04 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android