簡體   English   中英

IE e.keyCode - 如何區分&符號和上箭頭?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM