在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

JS组合按键事件监听插件

2016-12-20 13:14| 发布者: zhangjf| 查看: 429| 评论: 0

摘要: JS组合按键事件监听,支持同时监听多组按键如{a,b,c,}{ctrl,c} script type=text/javascript (function(){ /** *dqKeys v1.0.0 | (c) 2016 www.findme.wang *@ ...
JS组合按键事件监听,支持同时监听多组按键如{a,b,c,}{ctrl,c}
  1. <script type="text/javascript">
  2. (function(){
  3. /**
  4. *dqKeys v1.0.0 | (c) 2016 www.findme.wang
  5. *@params json keys 监听的按键
  6. *@params bool isOrder 按键是否有相应的顺序
  7. *@params Function sucFuc 完成按键的回调函数
  8. *@params Function cancelFuc 完成按键取消后的回调函数
  9. *@author lidequan
  10. */
  11. var dqKeys = function(keys,isOrder,sucFuc,cancelFuc) {
  12. // 函数体
  13. return new dqKeys.fn.init(keys,isOrder,sucFuc,cancelFuc);
  14. }
  15. dqKeys.fn = dqKeys.prototype = {
  16. 'version':'1.0.0', //版本号
  17. 'author':'lidequan', //作者
  18. 'rightKeys':{}, //监听的按键{key:code},code为按键对应的ascii码
  19. 'curKeys':[], //当前按下的键
  20. 'sucFuc':null, //完成按键的回调函数
  21. 'cancelFuc':null, //完成按键取消后的回调函数
  22. 'isFinsh':false, //判断是否完成按键
  23. 'isOrder':false, //按键是否有相应的顺序
  24. init:function(keys,isOrder,sucFuc,cancelFuc){
  25. this.rightKeys=keys;
  26. this.sucFuc=sucFuc;
  27. this.cancelFuc=cancelFuc;
  28. this.isOrder=isOrder;
  29. return this;
  30. },
  31. listenkeys:function(){//监听用户键盘操作
  32. var _self=this;
  33. _self.addListener('keydown', function(oEvent){
  34. var oEvent =oEvent || window.event;
  35. if(!_self.arrayContain(_self.curKeys,oEvent.keyCode)){
  36. if(_self.isOrder && _self.getNextKey() == oEvent.keyCode){
  37. _self.curKeys.push(oEvent.keyCode);
  38. }else if(!_self.isOrder){
  39. _self.curKeys.push(oEvent.keyCode);
  40. }
  41. }
  42. if(_self.checkResult(_self.rightKeys,_self.curKeys)){
  43. if(_self.sucFuc && !_self.isFinsh){
  44. _self.sucFuc();
  45. }
  46. _self.isFinsh=true;
  47. }
  48. });
  49. _self.addListener('keyup', function(oEvent){
  50. var oEvent =oEvent || window.event;
  51. if(_self.checkResult(_self.rightKeys,_self.curKeys) && _self.isFinsh){
  52. //完成按键,又取消的事件
  53. if(_self.cancelFuc){
  54. _self.cancelFuc();
  55. }
  56. }
  57. _self.curKey=_self.remove(_self.curKeys,oEvent.keyCode);
  58. _self.isFinsh=false;
  59. });
  60. },
  61. arrayContain:function(arr,val){//判断数组中是否包含某个元素
  62. return (arr.indexOf(val) == -1) ? false:true;
  63. },
  64. checkResult:function(json,arr){ //判断用户是否按下监听的所有按键
  65. for(var i in json){
  66. if(arr.indexOf(json[i])==-1){
  67. return false;
  68. }
  69. }
  70. return true;
  71. },
  72. remove:function(arr,val) { //从数组中移除某个元素
  73. var index = arr.indexOf(val);
  74. if (index > -1) {
  75. arr.splice(index, 1);
  76. }
  77. return arr;
  78. },
  79. getNextKey:function(){ //获取下一次按键对应的ascii码
  80. for(var i in this.rightKeys){
  81. if(this.curKeys.indexOf(this.rightKeys[i])==-1){
  82. return this.rightKeys[i];
  83. }
  84. }
  85. return null;
  86. },
  87. addListener:function(ev,fn,bool){ //事件绑定
  88. if (document.attachEvent) {
  89. document.attachEvent('on' + ev, fn);
  90. }else{
  91. document.addEventListener(ev,fn,bool);
  92. }
  93. }
  94. }
  95. dqKeys.fn.init.prototype = dqKeys.fn;
  96. window.dqKeys = window.$$= dqKeys;
  97. })();
  98. //1.测试
  99. dqKeys({'a':65,'b':66},true,function(){
  100. console.log('okey');
  101. },function(){
  102. console.log('cancel');
  103. }).listenkeys();
  104. //2.测试
  105. var dqKeys=new $$({'c':67,'d':68},false,function(){
  106. console.log('keys down ');
  107. },function(){
  108. console.log('keys cancel');
  109. });
  110. dqKeys.listenkeys();
  111. </script>
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 07:15

Copyright 2015-2025 djqfx

返回顶部