溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Javascript中click與blur事件的順序詳析

發(fā)布時(shí)間:2020-08-24 05:24:28 來源:腳本之家 閱讀:661 作者:zakwu 欄目:web開發(fā)

一、現(xiàn)象

最近在開發(fā)中碰到了一個(gè)需求,具體需求如下圖。

Javascript中click與blur事件的順序詳析

這是一個(gè)很常見的需求,input框負(fù)責(zé)在點(diǎn)擊回車和失焦的時(shí)候確認(rèn)輸入。button負(fù)責(zé)清除輸入,input綁定代碼為:

input.addEventListener('blur',function(){
 console.log('input blur');
});
input.addEventListener('keyup',function(){
 console.log('input keyup');
});

"X"綁定的代碼為:

button.addEventListener('click', function(e){
 console.log('button click');
});

嘗試著執(zhí)行代碼,并按照先輸入再點(diǎn)擊按鈕取消的操作,結(jié)果如下:

Javascript中click與blur事件的順序詳析

可以看到,input blur在button的click之前觸發(fā)了,這就導(dǎo)致取消操作其實(shí)并沒有起到作用。

同時(shí),也能發(fā)現(xiàn)事件的執(zhí)行順序?yàn)?input-blur) -> (button-click);

二、解決方案1

最簡單的解決方案為:將button的時(shí)間換成onmousedown事件,可以得到如下結(jié)果:

Javascript中click與blur事件的順序詳析

事件順序正確了,但是這種解決方式有兩個(gè)問題:

     a)無法在按下按鈕后取消點(diǎn)擊

     b)控制blur是否執(zhí)行,需要額外的代碼

那么有木有進(jìn)一步解決方案呢?

三、解決方案2

對button同時(shí)綁定mousedown和blur事件即可,具體代碼和執(zhí)行結(jié)果如下:

button.addEventListener('mousedown', function(e){
 console.log('button mousedown');
 e.preventDefault();
});
button.addEventListener('click', function(e){
 console.log('button click');
 input.blur();
});

Javascript中click與blur事件的順序詳析

這樣的方式,就克服了第一種方案的兩個(gè)弊端,也完美的解決了需求。

四、執(zhí)行順序探秘

查詢w3c標(biāo)準(zhǔn)后,沒有發(fā)現(xiàn)關(guān)于blur和mousedown,click的順序說明。根據(jù)猜測,blur需要mousedown執(zhí)行默認(rèn)事件來觸發(fā)。所以總結(jié)事件順序應(yīng)為:mousedown->(other)blur->mouseup->click

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI