Javascript 无法覆盖键盘ALT修饰符
我正在编写一个Javascript类来处理击键以及击键组合。例如,下面将为SHIFT键添加回调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
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) 在释放ALT和F后,只有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。希望这能有所帮助