2016-02-14 25 views
22

根據MDN,我們絕對應該使用.keyCode屬性而不是。它已經過時:已棄用JavaScript keyCode。這在實踐中意味着什麼?

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

在W3上的學校,這個事實被淡化了,而且只有一個側面說明說.keyCode是僅供兼容性,而且DOM事件規範的最新版本,建議使用.key屬性代替。

問題是.key不支持瀏覽器,所以我們應該使用什麼?有什麼我失蹤?

+1

你能否請一個正確的答案,所以這個問題不會再出現? –

回答

7

你有三種方式來處理它,因爲它是寫你共享的鏈接。

if (event.key !== undefined) { 
 
    
 
} else if (event.keyIdentifier !== undefined) { 
 
    
 
} else if (event.keyCode !== undefined) { 
 
    
 
}

你應該考慮他們,這就是如果你想跨瀏覽器支持的正確途徑。

如果你實現這樣的事情可能會更容易。

var dispatchForCode = function(event, callback) { 
 
    var code; 
 
    
 
    if (event.key !== undefined) { 
 
    code = event.key; 
 
    } else if (event.keyIdentifier !== undefined) { 
 
    code = event.keyIdentifier; 
 
    } else if (event.keyCode !== undefined) { 
 
    code = event.keyCode; 
 
    } 
 
    
 
    callback(code); 
 
};

+1

我的確讀過,但似乎有很多額外的代碼,除了MDN之外沒有其他原因說過某些東西已被棄用,當它在所有主流瀏覽器中都能正常工作時。但如果這是正確的方法,那麼謝謝! – Jason210

+1

哇看看這個。 http://caniuse.com/#search=keyCode(這個KeyboardEvent屬性在所有瀏覽器中都得到了支持(因爲IE6 +,Firefox2 +,Chrome1 +等在談論.keyCode) –

+1

這就是所有這些令人討厭的東西。所有主流瀏覽器都支持keyCode,但是請嘗試檢查.key屬性,這是推薦的屬性,並且幾乎沒有任何用處! – Jason210

6

MDN已經提供了一個解決方案:

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

window.addEventListener("keydown", function (event) { 
    if (event.defaultPrevented) { 
    return; // Should do nothing if the default action has been cancelled 
    } 

    var handled = false; 
    if (event.key !== undefined) { 
    // Handle the event with KeyboardEvent.key and set handled true. 
    } else if (event.keyIdentifier !== undefined) { 
    // Handle the event with KeyboardEvent.keyIdentifier and set handled true. 
    } else if (event.keyCode !== undefined) { 
    // Handle the event with KeyboardEvent.keyCode and set handled true. 
    } 

    if (handled) { 
    // Suppress "double action" if event handled 
    event.preventDefault(); 
    } 
}, true); 
+1

先生,你似乎不明白這個問題。 –

+0

Thanks @Bálint更正了這個問題 –

+2

這不是我稱之爲解決方案的問題,而是針對MDN自己創建的問題提出的解決方法......但是,謝謝。 – Jason210

1

做我想做的。我根本不在乎。 MDN可以說它已被棄用,但如果他們沒有提供替代(keyIdentifier除外),那麼您必須使用已棄用的版本。

+1

這就是我一直在做的事情... – Jason210

+4

'我不在乎'在這裏不是很有幫助。不贊成可能意味着支持將在不久的將來消失,不一定馬上就會消失。 – poepje

+0

'keyIdentifier'也被棄用。 –

4

此外,所有的keyCodewhichcharCodekeyIdentifier被棄用:
charCodekeyIdentifier是非標準的特性。
keyIdentifier從Chrome 54和Opera 41.0中刪除
keyCode在FF上的正常字符的按鍵事件上返回0。

The key property

readonly attribute DOMString key 

保持對應於該按鍵的鍵屬性值按

在編寫這本書的時候,key財產被所有主流瀏覽器的支持:Firefox 52,Chrome 55,Safari 10.1,Opera 46.除Internet Explorer 11以外: 非標準鍵標識符和AltG的不正確行爲拉斐。More info
如果是重要和/或後向兼容性是,那麼就可以使用特徵檢測,如以下代碼:

注意,key值是從在該keyCodewhich性質的不同:它包含密鑰的名稱而不是其代碼。如果你的程序需要字符代碼,那麼你可以使用charCodeAt()。 對於單個可打印字符,您可以使用charCodeAt(),如果您要處理的鍵值包含多個字符,如ArrowUp 可能是:您正在測試特殊鍵並相應採取相應操作。因此,嘗試推行鍵的值的表和它們對應的 碼charCodeArr["ArrowUp"]=38charCodeArr["Enter"]=13charCodeArr[Escape]=27 ...等,請看一看Key Values及其corresponding codes

if(e.key!=undefined){ 
     var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0); 
    }else{ 
     /* As @Leonid suggeted */ 
     var characterCode = e.which || e.charCode || e.keyCode || 0; 
    } 
     /* ... code making use of characterCode variable */ 

可能要考慮未來是可用的,而他們的相容性,即使用傳統的性能,只有當下跌切換到新的:

if(e.which || e.charCode || e.keyCode){ 
     var characterCode = e.which || e.charCode || e.keyCode; 
    }else if (e.key!=undefined){ 
     var characterCode = charCodeArr[e.key] || e.key.charCodeAt(0); 
    }else{ 
     var characterCode = 0; 
    } 

參見:KeyboardEvent.code財產docs以及answer中的一些更多詳細信息。

+0

您的解決方案在我的瀏覽器(Windows 10,Chrome 60,比利時鍵盤)中無法使用。首先,'charCodeArr'函數不存在。另外,'charCodeAt'不適用於'e.key'的所有值。例如,對於「Enter」/「Return」鍵,「e.key」屬性的值爲「Enter」,對該字符串執行「charCodeArr」將返回值「69」(這是ASCII碼對於字符「E」)。 –

+0

@JohnSlegers,是的,這是一個錯字,我的意思是一個用戶構建的數組。請參閱我更新的答案以獲取更多詳細信息。 – user10089632