keycode快捷每个功能 [英] keycode shortcut each function

查看:123
本文介绍了keycode快捷每个功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个小脚本捕获关键事件并轻松绑定它们上的函数。但我现在卡住了!

I'm working yet on a small script to capture keyevents and easily bind functions on them. But I'm stuck for now!

问题是,如果我初始化多个eventhandler,它会覆盖第一次初始化的参数。

The problem is, that if I initalize more than one "eventhandler" it overides arguments from the first initialization.

成千上万的单词并不比一些代码行多。所以,这是我到目前为止所做的:

Thousands of words do not say more than some lines of code. So, here's what I've done so far:

var keyCodes={a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,"0":48,"1":49,"2":50,"3":51,"4":52,"5":53,"6":54,"7":55,"8":56,"9":57,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,shift:16,ctrl:17,control:17,alt:18,option:18,opt:18,cmd:224,command:224,fn:255,"function":255,backspace:8,"delete":8,enter:13,"return":13,left:37,up:38,right:39,down:40};

var keyCall = function(k, fn, c, e, k2, nk) {
    this.onkeydown = function() {
        nk = k.split(" ");
        c = e ? e.which : event.keyCode;
        if (nk.length > 1) {
            if (keyCodes[nk[0]] === c) {
                k2 = true;
            }
            if (keyCodes[nk[1]] === c && k2 === true) {
                fn();
                k2 = false;
            }
        } else if (keyCodes[nk[0]] === c) {
            fn();
        }
    };
};


keyCall('ctrl a', function() { // overridden by `keyCall('shift a'`
    alert('callback1');
});

keyCall('shift a', function() {
    alert('callback2');
});

如果您认为带注释的版本是有用的,我已经优化了它的最小字节数,所以就这么说吧!对于每个需要的人,这是一个小提琴

I've optimized it for a highly minimum of bytes, if you think an annotated version is usefull, so just say it! For everyone who needs, here's a fiddle

更新

pascalfree修复了它!但是现在出现了一个问题......

pascalfree has fixed it! But anoter problem is now coming up...

占位符 - 变量 k2 检查第一个键是否被按下。但是现在如果你按下并释放 ctrl 然后点击 a -key该函数将被触发。有什么想法吗?

The "placeholder"-variable k2 checks if the first key was/is pressed. But for now if you press and release ctrl and hit thereafter the a-key the function will fired. Any ideas?

推荐答案

我假设onKeyPress事件绑定到某个html元素,如下所示:

I assume the onKeyPress event is bound to some html element like this:

keyCall.apply(wi ndow.body,['shift a',function(){alert('a')}]);

为了追加您可以检查其他事件是否已定义事件处理程序并在新函数中调用它:

In order to append additional events you can check if an eventhandler already is defined and call it in your new function:

var keyCall = function(k, fn, c, e, k2, nk) {
    var oldOnkeydown = this.onkeydown; //get old event handler
    this.onkeydown = function() {
        if( typeof oldOnkeydown == "function" ) { oldOnkeydown() } //call in new eventhandler.
        nk = k.split(" ");
        c = e ? e.which : event.keyCode;
        if (nk.length > 1) {
            if (keyCodes[nk[0]] === c) {
                k2 = true;
            }
            if (keyCodes[nk[1]] === c && k2 === true) {
                fn();
                k2 = false;
            }
        } else if (keyCodes[nk[0]] === c) {
            fn();
        }
    };
    //reset k2 onkeyup
    var oldOnkeyup = this.onkeyup;
    this.onkeyup = function() {
      if( typeof oldOnkeyup == "function" ) { oldOnkeyup() }
      k2 = false;
    };
};

我只添加了两行评论。 (+ onkeyup事件最后用于解决评论中的问题)

I only added the 2 lines with comments. (+ onkeyup event at the end to solve problem from comments)

来源: http://www.webreference.com/programming/javascript/onloads/index.html

这篇关于keycode快捷每个功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆