鱼C论坛

 找回密码
 立即注册
查看: 2188|回复: 0

[作品展示] js&html.按键触发事件

[复制链接]
发表于 2020-8-11 20:21:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
非常简单的一个东西,但是太菜了所以写得比较臃肿。
/**对比两个列表项是否相同(无序)*/
function arrayCmp(CArray,keysArray){
    if(CArray&&keysArray){
        if(CArray.length!=keysArray.length)
            return false;
        var ALength=CArray.length;
        var flags=Array(ALength)
        for(var i=ALength-1;i>=0;--i){
            for(var j=ALength-1;j>=0;--j){
                if(CArray[i]==keysArray[j]){
                    flags[i]=true;
                }
            }
        }
        for(var i=ALength-1;i>=0;--i){
            if(!flags[i])return false;
        }
        return true;
    }
}

/**按键记录器key notbook*/
function keyNB(){
    this.FElement;
    this.downingKeyCodes=[];
    this.keysdownF  =[];    //function
    this.keysdownFF =[];    //function flag
    this.keysupF={};
}

keyNB.prototype={
    // 添加按键事件
    setDKeyFunc:function(keycode,func){
        if(!keycode||!func){
            return -1;
        }
        if(keycode.constructor==Number){
            this.keysdownFF.push([keycode]);
        }
        else if(keycode.constructor==Array){
            this.keysdownFF.push(keycode);
        }
        this.keysdownF.push(func);
    },
    
    // 移除按键事件
    removeDKeyFunc:function(_keycode,func){
        var keycode;
        if(!_keycode||!func){
            return -1;
        }
        if(_keycode.constructor==Number){
            keycode=[_keycode];
        }
        else if(_keycode.constructor==Array){
            keycode=_keycode;
        }
        for(var i=this.keysdownFF.length-1;i>=0;--i){
            if(arrayCmp(this.keysdownFF[i],keycode)){
                if(this.keysdownF[i]==func){
                    this.keysdownF.splice(i,1);
                    this.keysdownFF.splice(i,1);
                    break;
                }
            }
        }
    },

    /**按下新按键*/
    setKey:function(e){
        var flag=false;
        var i=0;
        var downingKALength=this.downingKeyCodes.length;
        if(downingKALength)
        for(var j=downingKALength-1;j>=0;--j){
            if(flag)break;
            flag=e.keyCode==this.downingKeyCodes[j];
            i++;
        }
        if(!flag){
            // 有新的按键按下
            this.downingKeyCodes[i]=e.keyCode;
            for(i=this.keysdownFF.length-1;i>=0;--i){
                if(arrayCmp(this.keysdownFF[i],this.downingKeyCodes)){
                    this.keysdownF[i].call(this.FElement,e);
                }
            }
        }
        else{
            for(i=this.keysdownFF.length-1;i>=0;--i){
                if(arrayCmp(this.keysdownFF[i],this.downingKeyCodes)&&!this.keysdownF.keepFlag){
                    this.keysdownF[i].call(this.FElement,e);
                }
            }
        }
    },

    /**抬起按键*/
    removeKey:function(e){
        var flag=false;
        var downingKALength=this.downingKeyCodes.length;
        if(downingKALength)
        for(var i=downingKALength-1;i>=0;--i){
            if(e.keyCode==this.downingKeyCodes[i]){
                this.downingKeyCodes.splice(i,1);
                if(this.keysupF[e.keyCode.toString()])this.keysupF[e.keyCode.toString()].call(this.FElement,e);
                return 0;
            }
        }
    },
    reNB:function(){
        this.downingKeyCodes=[];
    }
}

/**
 * 添加按键事件
 * @param {Document} _Element 
 * @param {Boolean} _keepFlag 是否重复触发事件
 * @param {Number||Array} _keycode 用数组表示组合键
 * @param {Function} _event 
 * @param {Boolean} _type flase=>down;true=>up
 */
function addKeyEvent(_Element,_keepFlag,_keycode,_event,_type){
    var thisKeyNotbook;
    if(!_Element.keyNotbook){
        _Element.keyNotbook=new keyNB();
        thisKeyNotbook=_Element.keyNotbook;
        thisKeyNotbook.FElement=_Element;
        _Element.addEventListener("keydown" ,function(e){thisKeyNotbook.setKey(e)});
        _Element.addEventListener("keyup"   ,function(e){thisKeyNotbook.removeKey(e)});
        _Element.addEventListener("blur"    ,function(e){thisKeyNotbook.reNB()});
    }
    else{
        thisKeyNotbook=_Element.keyNotbook;
    }
    if(_type){
        thisKeyNotbook.keysupF[_keycode.toString()]=_event;
    }
    else{
        thisKeyNotbook.setDKeyFunc(_keycode,_event);
        thisKeyNotbook.keysdownF[thisKeyNotbook.keysdownF.length-1].keepFlag=_keepFlag;
    }
}

/**
 * 移除按键事件
 * @param {Document} _Element 
 * @param {Number||Array} _keycode 
 * @param {Function} _event 
 * @param {} _type flase=>down;true=>up
 */
function removeKeyEvent(_Element,_keycode,_event,_type){
    if(_Element.keyNotbook){
        var thisKeyNotbook=_Element.keyNotbook;
        if(_type){
            delete thisKeyNotbook.keysupF[_keycode.toString()];
        }
        else{
            thisKeyNotbook.removeDKeyFunc(_keycode,_event);
        }
    }
}

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表