Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法覆盖键盘ALT修饰符_Javascript_Prototypejs - Fatal编程技术网

Javascript 无法覆盖键盘ALT修饰符

Javascript 无法覆盖键盘ALT修饰符,javascript,prototypejs,Javascript,Prototypejs,我正在编写一个Javascript类来处理击键以及击键组合。例如,下面将为SHIFT键添加回调 MYAPP.Keyboard.instance().observe( MYAPP.Keyboard.type.KEYDOWN, MYAPP.Keyboard.key.SHIFT, function() { $$('body').first().addClassName('keyboardHintShow'); } ); SHIFT+F的一个例子是: M

我正在编写一个Javascript类来处理击键以及击键组合。例如,下面将为SHIFT键添加回调

MYAPP.Keyboard.instance().observe(
    MYAPP.Keyboard.type.KEYDOWN,
    MYAPP.Keyboard.key.SHIFT,
    function() {
        $$('body').first().addClassName('keyboardHintShow');
    }
);
SHIFT+F的一个例子是:

MYAPP.Keyboard.instance().observe(
    MYAPP.Keyboard.type.KEYUP,
    [MYAPP.Keyboard.key.F, MYAPP.Keyboard.key.SHIFT],
    function() {
        MYAPP.Broadcast.instance().signal('file');
    }
);  
到目前为止,这在Firefox中工作得很好,但当我尝试使用ALT作为修改器时就不行了。出现了两个问题。1) 事件传播不会停止,因此会弹出Firefox的文件菜单。2) 在释放ALTF后,只有F的onKeyUp会触发,因此ALT的状态是错误的。是什么使ALT和SHIFT如此不同

以下是完整的代码:

MYAPP.Keyboard = Class.create({

/*******************************************************************************
PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUBLIC PUB
*******************************************************************************/

    /**
     * @return pointer
     */
    initialize: function() {
        this.downKeys = new Hash();
        this.observers = new Hash();

        document.observe(
            'keydown',
            this.onKeyDown.bind(this)
        );

        document.observe(
            'keyup',
            this.onKeyUp.bind(this)
        );
    },

    /**
     * @param MYAPP.Keyboard.type type
     * @param MYAPP.Keyboard.key | array of MYAPP.Keyboard.key keys
     * @param void function() callback
     * @return void
     */
    observe: function(type, keys, callback) {
        var main;
        var modifiers;

        if (typeof(keys) === 'number') {
            main = keys;
            modifiers = [];
        } else {
            main = keys.first();
            modifiers = keys.slice(1);
        }

        if (this.observers.get(type) === undefined) {
            this.observers.set(type, new Hash());
        }

        this.observers.get(type).set(
            main, {
                modifiers: modifiers,
                callback: callback
            }
        );
    },

    /**
     * @param MYAPP.Keyboard.type type
     * @param MYAPP.Keyboard.key
     * @return void
     */
    stopObserving: function(type, key) {
        this.observers.get(type).unset(key);
    },

/*******************************************************************************
PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE PRIVATE 
*******************************************************************************/

    /**
     * @param Event event
     * @return void
     */
    onKeyDown: function(event) {
        if (this.downKeys.get(event.keyCode) === true) {
            return;
        }

        this.downKeys.set(event.keyCode, true);

        var downObservers = this.observers.get(MYAPP.Keyboard.type.KEYDOWN);
        if (downObservers !== undefined) {
            this.runCallback(downObservers, event);
        }
        return false;
    },

    /**
     * @param Event event
     * @return void
     */
    onKeyUp: function(event) {
        this.downKeys.set(event.keyCode, false);

        var downObservers = this.observers.get(MYAPP.Keyboard.type.KEYUP);
        if (downObservers !== undefined) {
            this.runCallback(downObservers, event);
        }
        return false;
    },

    /**
     * @param Hash observers
     * @param Event event
     * @return void
     */
    runCallback: function(observers, event) {
        var overrideBrowser = false;
        var order = observers.get(event.keyCode);
        if (order !== undefined) {
            if (order.modifiers.size() === 0) {
                order.callback();
                Event.stop(event);
            } else {
                for (var i = 0; i < order.modifiers.size(); i++) {
                    var modifierStatus = this.downKeys.get(order.modifiers[i]);
                    if (modifierStatus === undefined || modifierStatus === false) {
                        return;
                    }
                    order.callback();
                    Event.stop(event);
                }
            }
        }
    }
});

/*******************************************************************************
STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STA
*******************************************************************************/

/**
 * @return Keyboard instance
 */
MYAPP.Keyboard.instance = function() {
    if (typeof(MYAPP.keyboard) === 'undefined') {
        MYAPP.keyboard = new MYAPP.Keyboard();
    }
    return MYAPP.keyboard;
};

/**
 * Event type
 */
MYAPP.Keyboard.type = {
    KEYUP: 0,
    KEYDOWN: 1 
};

/**
 * Keycodes for various keys.
 */
MYAPP.Keyboard.key = {
    SHIFT: 16,
    CTRL: 17,
    ALT: 18,
    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
};
MYAPP.Keyboard=Class.create({
/*******************************************************************************
公共酒吧
*******************************************************************************/
/**
*@返回指针
*/
初始化:函数(){
this.downKeys=new Hash();
this.obsers=新哈希();
注意(
“按下键”,
this.onKeyDown.bind(this)
);
注意(
“keyup”,
this.onKeyUp.bind(this)
);
},
/**
*@param MYAPP.Keyboard.type
*@param MYAPP.Keyboard.key | MYAPP.Keyboard.key的数组
*@param void function()回调函数
*@返回无效
*/
观察:函数(类型、键、回调){
var main;
var修饰符;
如果(键的类型)=“数字”){
main=键;
修饰符=[];
}否则{
main=keys.first();
修饰符=关键点。切片(1);
}
if(this.observators.get(type)==未定义){
this.observer.set(type,new Hash());
}
this.observators.get(type).set(
主要的{
修饰符:修饰符,
回调:回调
}
);
},
/**
*@param MYAPP.Keyboard.type
*@param MYAPP.Keyboard.key
*@返回无效
*/
停止观察:功能(类型、键){
this.observer.get(type).unset(key);
},
/*******************************************************************************
私人私人私人私人私人私人
*******************************************************************************/
/**
*@param事件
*@返回无效
*/
onKeyDown:函数(事件){
if(this.downKeys.get(event.keyCode)==true){
返回;
}
this.downKeys.set(event.keyCode,true);
var downObservators=this.obbservators.get(MYAPP.Keyboard.type.KEYDOWN);
如果(向下观察者!==未定义){
this.runCallback(downObservers,事件);
}
返回false;
},
/**
*@param事件
*@返回无效
*/
onKeyUp:函数(事件){
this.downKeys.set(event.keyCode,false);
var downObservators=this.obbservators.get(MYAPP.Keyboard.type.KEYUP);
如果(向下观察者!==未定义){
this.runCallback(downObservers,事件);
}
返回false;
},
/**
*@param散列观察员
*@param事件
*@返回无效
*/
runCallback:函数(观察者、事件){
var overrideBrowser=false;
var order=observators.get(event.keyCode);
如果(订单!==未定义){
if(order.modifiers.size()==0){
order.callback();
事件。停止(事件);
}否则{
对于(var i=0;i
作为一个例子可能会有所帮助。在页面底部,作者声称他的脚本覆盖了所有修饰符——Ctrl、Alt、Shift、Meta。希望这能有所帮助