[英]IE e.keyCode - How can I differentiate between ampersand and up-arrow?
我正在嘗試修復jQuery UI小部件上的一個非常奇怪的javascript行為。 IE7(win XP),jQuery 1.2.6(是的,它是舊版本)。
小部件是一個組合框,它捕獲鍵盤事件並具有箭頭鍵的特殊行為。
當我嘗試在彈性框輸入字段中鍵入“&”字符時,我會遇到奇怪的行為。
flexbox有一些代碼,如:
//initialization
$myInputElement.keypress($.flexbox.process_key);
$.flexbox.process_key = function process_key(e) {
$.flexbox.flexboxFromInput(this).processKey(e);
return true;
};
//on the flexbox object's prototype:
...
processKey: function processKey(e) {
var mod = 0;
if (typeof (e.ctrlKey) !== 'undefined') {
if (e.ctrlKey) mod |= 1;
if (e.shiftKey) mod |= 2;
} else {
if (e.modifiers & Event.CONTROL_MASK) mod |= 1;
if (e.modifiers & Event.SHIFT_MASK) mod |= 2;
}
...
switch (e.keyCode) {
case 38: // up
this.prevResult();
break;
case 40: // down
if (this.getCtr().is(':visible')) this.nextResult();
else this.flexboxDelay(true);
break;
...etc.
}
}
...
當我介紹一個日志記錄語句時,我發現按“&”(shift + 7)會產生三個按鍵事件:
INFO: Flexbox> processKey, keyCode=16, ctrl=false, shift=true
INFO: Flexbox> processKey, keyCode=55, ctrl=false, shift=true
INFO: Flexbox> processKey, keyCode=38, ctrl=false, shift=true
顯然,keyCode 38既是向上箭頭鍵又是用於&符號的ASCII碼?
在我寫這篇文章時,我發現我可以將按鍵檢測為“shift + 7”(keyCode 55)將其視為&符號鍵,然后設置某種標志以忽略下一個按鍵(即38) )。 這看起來像是一個可怕的黑客。
有沒有人有更好的方法來區分特殊字符,如“&”和IE中的箭頭鍵?
這就是我最終做的事情:
/*
* Hack around a wierd behavior in IE where "&%'(" have the same keyCodes
* as the arrow keys.
*/
if (keyCodeIn(e.keyCode, 55, 53, 57) && (mod & 2) && !(mod & 1)) {
this.ignoreNextArrowKey = true;
}
else if (222 === e.keyCode && !(mod & 2) && !(mod & 1)) {
this.ignoreNextArrowKey = true;
}
else if (keyCodeIn(e.keyCode, 38, 37, 39, 40) && this.ignoreNextArrowKey) {
this.ignoreNextArrowKey = false;
return;
}
//...
function keyCodeIn(keyCode) {
for(var i = 1; i < arguments.length; i++) {
if (arguments[i] === keyCode) {
return true;
}
}
return false;
}
希望這有助於某人。 如果您正在重復使用此代碼,則可能必須調整關鍵字“this”的使用情況,具體取決於它引用的對象(此處,它是與flexbox小部件關聯的javascript對象)。
編輯:我更新了這段代碼,並刪除了之前存在的正則表達式測試,我發現它是錯誤的。
我認為keydown
可能會給你提供比keypress
更可靠的數據。
我建議使用此jquery庫為按鍵編寫自定義處理程序: http : //code.google.com/p/js-hotkeys/
試圖從邏輯上辨別鍵碼是一場噩夢。
向上或向下鍵返回'&'的keyCode為55,'Arrow'返回38
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.