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读取cookies信息(记录用户名)
Jan 10 Javascript
技术男用来对妹子表白的百度首页
Jul 23 Javascript
javascript里使用php代码实例
Dec 13 Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 Javascript
微信小程序 下拉菜单的实现
Apr 06 Javascript
Vue关于数据绑定出错解决办法
May 15 Javascript
Vue仿手机qq的实例代码(demo)
Sep 08 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
Oct 13 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
Jan 03 Javascript
图文讲解vue的v-if使用方法
Feb 11 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
Jul 24 Javascript
nuxt 路由、过渡特效、中间件的实现代码
Nov 06 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
ip签名探针
2006/10/09 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
angularjs实现简单的购物车功能
2017/09/21 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
python实现simhash算法实例
2014/04/25 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
django之常用命令详解
2016/06/30 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
C语言编程练习
2012/04/02 面试题
迟到早退检讨书
2014/02/10 职场文书
青年志愿者活动总结
2014/04/26 职场文书
促销活动总结模板
2014/07/01 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
学习保证书
2015/01/17 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫