用戶在使用鍵盤時會觸發鍵盤事件。目前,對鍵盤事件的支持主要遵循的是DOM0級。html
在英文輸入法下,全部瀏覽器都遵循如下三個事件:jquery
在中文輸入法下,瀏覽器之間則表現得不一致,主要狀況以下:chrome
全部元素都支持以上三個事件,通常狀況下只有在文本框時才常常用到。瀏覽器
鍵盤事件的觸發過程具體是這樣的: 在用戶按下鍵盤上的一個字符鍵時, 首先會觸發keydown事件,而後是keypress事件,最後是keyup事件。其中,keydown和keypress事件是在文本框發生變化以前 被觸發;而keyup在文本框發生變化以後被觸發。若是用戶按下一個鍵不放,就會重複觸發keydown和keypress事件。在用戶按下一個非字符鍵時,首先觸發keydown事件,而後就是keyup事件。若是用戶按下一個鍵不放,就會重複觸發keydown。
編碼
當咱們監聽這三個事件時,最想獲得的數據信息就是鍵碼(keyCode)和字符編碼(charCode)了。spa
鍵碼(keyCode)firefox
在發生keydown和keyup事件時,event對象的keyCode屬性會包含一個代碼,keyCode屬性的值就是小寫字母或數字對應的ASCII碼(點擊這裏查看ASCII碼錶),在程序中可經過以下代碼來得到keyCode值:code
//EventUtil是一個封裝的對象,用來處理跨瀏覽器事件 var textbox = document.getElementById('myText'); EventUtil.addHandler(textbox,'keydown',function(event){ event = event || window.event; alert(event.keyCode); });
如下是keydown和keypress事件存在的一些特殊狀況:htm
字符編碼(charCode)對象
在發生keypress事件時,FF、Chrome和Safari的event對象都支持一個charCode屬性,charCode屬性的值 就是按下的字符鍵對應的ASCII編碼,這個屬性在按下非字符鍵或發生keydown和keyup事件時值爲0;IE和Opera則是在keyCode中 保存字符鍵的ASCII編碼。因此,要想跨瀏覽器得到字符編碼,代碼以下:
//獲取字符編碼 var getCharCode = function(event){ var charcode = event.charCode; if(typeof charcode == "number" && charcode != 0){ return charcode; }else{ //在中文輸入法下 keyCode == 229 || keyCode == 197(Opera) return event.keyCode; } };
這個方法首先檢查charCode屬性是否包含數值(在不支持這個屬性的瀏覽器中,值爲undefined),在判斷是否等於0(兼容keydown和keyup事件),若是條件成立,則返回改值,不然返回keyCode的值。以前的例子獲取字符編碼以下:
var textbox = document.getElementById('myText'); EventUtil.addHandler(textbox,'keydown',function(event){ event = event || window.event; alert(getCharCode(event)); });
在獲得了字符編碼後,可使用String.fromCharCode()將其轉換爲實際的字符。
鍵盤事件的應用
一、 過濾輸入——屏蔽某些字符的輸入
達到的效果:只能輸入數字,輸入其餘字符沒有反應。不屏蔽輔助輸入的按鍵,如退格鍵,方向鍵,複製,粘貼等。
原理很簡單:在文本框修改前,獲取字符編碼,判斷合理性,不成立則阻止鍵盤的默認事件。看起來很簡單,但因爲瀏覽器的兼容問題,實現起來仍是有點難度。代碼以下:
var handler= function(e){ e = e || window.event; var charcode = typeof e.charCode == 'number' ? e.charCode : e.keyCode; var re = /\d/; //FF和safari3.1之前版本會對方向鍵、退格鍵、刪除鍵觸發keypress事件 charcode > 9 可修復此Bug //!e.ctrlKey 不屏蔽Ctrl+C,Ctrl+V if(!re.test(String.fromCharCode(charcode)) && charcode > 9 && !e.ctrlKey){ //阻止默認事件 if(e.preventDefault){ e.preventDefault(); }else{ e.returnValue = false; } } }; EventUtil.addHandler(textbox,'keypress',handler); //監聽粘貼事件 EventUtil.addHandler(textbox,'paste',function(e){ e = e || window.event; var clipboardData = e.clipboardData || window.clipboardData; if(!/^\d*$/.test(clipboardData.getData('text'))){ //阻止默認事件 if(e.preventDefault){ e.preventDefault(); }else{ e.returnValue = false; } } });
在這個例子的基礎上加以修改和調整,就能夠應用於放過或屏蔽任何輸入文本框的字符。
很遺憾,還有一個bug未能解決,就是在中文輸入法時keypress事件失效問題。
針對中文輸入法的Bug,目前找到的解決辦法是:在文本框加入屬性style="ime-mode:disabled" IE和FF下可禁用輸入法;在Chrome,Safar下可爲文本框添加keydown事件,判斷event.keyCode是否等於299,是的話就阻 止keydown默認事件,這種方法對IE也有效。而對於Opera則沒有找到解決辦法。