最近在開(kāi)發(fā)一個(gè)Web應(yīng)用程序的時(shí)候,我遇到了一個(gè)問(wèn)題:如何實(shí)現(xiàn)在用戶輸入值后,當(dāng)他按下回車鍵時(shí)執(zhí)行某個(gè)操作呢?后來(lái)我發(fā)現(xiàn)了JavaScript提供的一個(gè)非常方便的解決方案,這就是我們今天要介紹的主題:JavaScript按回車事件處理。
在理解這個(gè)事件之前,我們需要先來(lái)看一下JavaScript的事件模型:事件模型分為事件捕獲和事件冒泡兩種。事件捕獲是由最頂層的容器開(kāi)始查找處理事件的對(duì)象,而事件冒泡則是相反的,是由最內(nèi)層元素開(kāi)始向外層元素傳遞事件處理程序。
// 以下代碼演示事件冒泡/捕獲過(guò)程 document.querySelector('#box').addEventListener('click', function(event) { event.stopPropagation(); // 阻止事件向上冒泡 console.log("div clicked!"); }, true); document.body.addEventListener('click', function(){ console.log("body clicked!"); }, true);
在上面的代碼中,當(dāng)我們點(diǎn)擊id為box的div元素時(shí),會(huì)看到控制臺(tái)打印“div clicked!”,而不會(huì)看到“body clicked!”,這是因?yàn)槭褂昧耸录东@的模式,所以先執(zhí)行了div的事件處理程序。
回到我們的主題上,當(dāng)用戶在一個(gè)文本框輸入完值后,他按下回車鍵,對(duì)應(yīng)的鍵碼是13。我們可以通過(guò)以下代碼來(lái)判斷是否按下了回車鍵:
document.addEventListener('keydown', function(e){ if(e.keyCode == 13){ console.log("Enter key pressed!"); } });
以上代碼監(jiān)聽(tīng)全局keydown事件(keydown事件在鍵被按下,按住不放,不斷觸發(fā);keyup事件在鍵被放開(kāi)時(shí)觸發(fā)一次),當(dāng)鍵碼是13時(shí),控制臺(tái)就會(huì)打印“Enter key pressed!”。
接下來(lái)的問(wèn)題就是,如何區(qū)分是哪個(gè)文本框按下了回車鍵呢?我們可以為每個(gè)文本框都綁定一個(gè)鍵盤事件監(jiān)聽(tīng)程序,當(dāng)回車鍵被按下時(shí)我們就可以知道是哪個(gè)文本框了。
// HTML代碼 <input type="text" id="name"> <input type="text" id="age"> <input type="text" id="gender"> // JavaScript代碼 document.getElementById('name').addEventListener('keydown', function(e) { if (e.keyCode == 13) { console.log("Name field Enter pressed!"); } }); document.getElementById('age').addEventListener('keydown', function(e) { if (e.keyCode == 13) { console.log("Age field Enter pressed!"); } }); document.getElementById('gender').addEventListener('keydown', function(e) { if (e.keyCode == 13) { console.log("Gender field Enter pressed!"); } });
以上代碼為三個(gè)文本框分別綁定了keydown事件監(jiān)聽(tīng)程序,分別輸出“Name field Enter pressed!”、“Age field Enter pressed!”和“Gender field Enter pressed!”,這樣我們就可以區(qū)分每個(gè)文本框分別按了回車鍵。
那么,以上代碼還有一個(gè)問(wèn)題:如果文本框數(shù)量很多,我們就需要循環(huán)綁定事件監(jiān)聽(tīng)程序,代碼顯得非常冗長(zhǎng)。有沒(méi)有一種更好的方式呢?其實(shí),我們可以使用事件委托來(lái)實(shí)現(xiàn)這個(gè)功能。
所謂事件委托,就是將事件處理程序綁定在其父元素上,通過(guò)捕獲或冒泡機(jī)制來(lái)判斷具體事件發(fā)生在哪個(gè)子元素上,從而統(tǒng)一處理事件,避免代碼冗長(zhǎng)。以下代碼演示如何使用事件委托來(lái)監(jiān)聽(tīng)多個(gè)文本框的回車事件:
// HTML代碼 <div id="container"> <input type="text" class="myInput"> <input type="text" class="myInput"> <input type="text" class="myInput"> </div> // JavaScript代碼 document.getElementById('container').addEventListener('keydown', function(e) { if (e.target && e.target.classList.contains('myInput') && e.keyCode == 13) { console.log("Input field Enter pressed!"); } });
以上代碼將事件處理程序綁定在id為container的div元素上,當(dāng)回車鍵被按下并且目標(biāo)元素是class為myInput的輸入框時(shí),就會(huì)輸出“Input field Enter pressed!”到控制臺(tái)。這樣,無(wú)論有多少個(gè)文本框,我們只需要綁定一次事件監(jiān)聽(tīng)程序就行了,代碼也更簡(jiǎn)潔明了。
總之,JavaScript的按回車事件處理在Web開(kāi)發(fā)中是一個(gè)非常常用的功能,我們可以通過(guò)監(jiān)聽(tīng)鍵盤事件、使用事件委托等方式來(lái)實(shí)現(xiàn)該功能,提高Web應(yīng)用程序的用戶體驗(yàn)。