keycode shortcut each function

隐身守侯 提交于 2019-12-23 04:44:00

问题


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

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

Update

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

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?


回答1:


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

keyCall.apply( window.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;
    };
};

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

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



来源:https://stackoverflow.com/questions/12461158/keycode-shortcut-each-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!