键盘事件



//定义每个键的事件处理程序

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" >
        function Keymap(bindings){
            this.map={};
            if(bindings){
                for(name in bindings) this.bind(name,bindings[name]);
            }
        }
        Keymap.prototype.bind=function(key,func){
            this.map[Keymap.normalize(key)]=func;
        };
        Keymap.normalize=function(keyid){
            keyid=keyid.toLowerCase();
            var words=keyid.split(/\s+|[\-+_]/);
            keyname=words.pop();
            keyname=Keymap.aliases[keyname] || keyname;
            words.sort();
            words.push(keyname);
            return words.join("_");
        };
        Keymap.aliases={
            "escape" : "esc",
            "delete" : "del",
            "return" : "enter",
            "ctrl" : "spacebar",
            "ins" : "insert"
        };
        Keymap.prototype.unbind=function(key){
           delete this.map[Keymap.normalize(key)];
        };
        Keymap.prototype.install=function(element){
            var keymap=this;
            function handler(event){return keymap.dispatch(event,element);}
            if(element.addEventListener) element.addEventListener("keydown",handler,false);
            else if(element.attachEvent) element.attachEvent("onkeydown",handler);


        };

        Keymap.prototype.dispatch=function(event,element){
            var modifiers="";
            var keyname=null;

            if(event.altKey) modifiers += "alt_";
            if(event.ctrlKey) modifiers += "ctrl_";
            if(event.metaKey) modifiers +="meta_";
            if(event.shiftKey)modifiers +="shift_";

            if(event.key)
            {
                keyname=event.key;
            }
            else if (event.keyIdentifier && event.keyIdentifier.substring(0,2) !== "U+"){

                keyname=event.keyIdentifier;

            }else
            {
                keyname=Keymap.keyCodeToKeyName[event.keyCode];

            }

            if(!keyname) return ;

            var keyid=modifiers + keyname.toLowerCase();
alert(keyid);
            var handler=this.map[keyid];
            if(handler){
                var retval=handler.call(element,event,keyid);
                if(retval==false){
                    if(event.stopPropagation) event.stopPropagation();
                    else event.cancelBubble=true;
                    if(event.preventDefault)event.preventDefault()
                    else event.returnValue=false;
                }
                return retval;
            }

        };

        Keymap.keyCodeToKeyName={
            65:'A',66:'B'
        };
        function load(){

           //以对象形式创建事件对象集合
            var obj={ "a":function(event,keyid){ alert("a:"+keyid); return false;},
            "b":function(event,keyid){alert("b:"+keyid);return false;}};

          //创建键盘映射对象
            var a=new Keymap(obj);

           //给元素定义事件处理程序
            a.install(document.getElementById("txt"));
        }
    </script>
</head>
<body οnlοad="load()">
<input type="text" id="txt" value="" >
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值