解決blur與click沖突

背景

在開(kāi)發(fā)下拉選擇(picker)組件中遇到疲眷,點(diǎn)擊輸入框出現(xiàn)下拉列表禾蚕,再點(diǎn)擊下拉列表選項(xiàng)后下拉列表自動(dòng)收縮,然而選項(xiàng)值并沒(méi)有選到

一狂丝、blur和click事件簡(jiǎn)述

  • blur事件:當(dāng)元素失去焦點(diǎn)時(shí)觸發(fā)blur事件换淆;其為表單事件,blur和focus事件不會(huì)冒泡几颜,其他表單事件都可以倍试。
  • click事件:當(dāng)點(diǎn)擊元素時(shí)觸發(fā)click事件;所有元素都有此事件蛋哭,會(huì)產(chǎn)生冒泡县习。

注(往往也是出現(xiàn)問(wèn)題的原因): 點(diǎn)擊某元素導(dǎo)致前一個(gè)元素失去焦點(diǎn),blur事件優(yōu)先于click事件

demo演示:

<input type="text" id="ipt">
<input type="button" id="btn" value="點(diǎn)我">
<script>
    var ipt = document.getElementById("ipt");
    ipt.addEventListener("blur", function(){
        console.log("my input blur");
    });

    var btn = document.getElementById("btn");
    btn.addEventListener("click", function(){
        console.log("my button click");
    });
</script>
// 輸出結(jié)果:
my input blur
my button click

二谆趾、產(chǎn)生問(wèn)題躁愿,blur與click沖突導(dǎo)致下拉值不能正常選值

實(shí)際開(kāi)發(fā)中,我們會(huì)經(jīng)常遇到某一下拉列表框沪蓬,點(diǎn)擊其他元素消失列表框彤钟;點(diǎn)擊下拉框子元素使其生效的需求。這就會(huì)面臨沖突問(wèn)題跷叉。
demo演示:

<!-- DOM結(jié)構(gòu)示意 -->
<input type="text" placeholder="請(qǐng)選擇" readonly>
<div  data-status="hide">
    <ul>
        <li><a href="javascript:">A</a></li>
        <li><a href="javascript:">B</a></li>
        <li><a href="javascript:">C</a></li>
        <li><a href="javascript:">D</a></li>
    </ul>
</div>
/** 說(shuō)明:
 *  目前通過(guò)ul外層div自定義屬性“data-status”控制其是否顯示   
 */
(function($){
    $("input").focus(function(){
        // input框獲取焦點(diǎn)逸雹,展示下拉框
        $(".search-list").attr("data-status", "show");
    }).blur(function(){
        // input框失去焦點(diǎn),隱藏下拉框
        $(".search-list").attr("data-status", "hide");
    });
    // 選擇對(duì)應(yīng)選項(xiàng)性芬,并賦值給input框
    $(".search-list li a").click(function(){
        console.log("執(zhí)行");
        $("input").val($(this).text());
    });
})(jQuery);

執(zhí)行demo,你會(huì)發(fā)現(xiàn)峡眶,并不能正確獲取下拉框中某值。
這是為什么呢植锉?:前文已知辫樱,blur優(yōu)先于click執(zhí)行,而JavaScript為單線程俊庇,同一時(shí)間只能執(zhí)行處理一個(gè)事件狮暑,這就導(dǎo)致blur事件優(yōu)先觸發(fā)鸡挠,隱藏了下拉框展示區(qū),所以導(dǎo)致其后續(xù)click事件并不會(huì)執(zhí)行搬男。

三拣展、解決方法

方法1:
用setTimeout對(duì)blur事件進(jìn)行延遲,讓click先執(zhí)行

//只提供關(guān)鍵代碼演示
 $("input").focus(function(){
        // input框獲取焦點(diǎn)缔逛,展示下拉框
        $(".search-list").attr("data-status", "show");
    }).blur(function(){
        // input框失去焦點(diǎn)备埃,隱藏下拉框
        setTimeout(()=> { $(".search-list").attr("data-status", "hide");},500)
    });

方法2:
使用mousedown代替click讓其優(yōu)先執(zhí)行
mousedown事件:當(dāng)鼠標(biāo)指針移動(dòng)到元素上方,并按下鼠標(biāo)按鍵時(shí)褐奴,會(huì)發(fā)生mousedown事件按脚。
mousedown事件優(yōu)先于click事件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敦冬,隨后出現(xiàn)的幾起案子辅搬,更是在濱河造成了極大的恐慌,老刑警劉巖脖旱,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堪遂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萌庆,警方通過(guò)查閱死者的電腦和手機(jī)溶褪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)践险,“玉大人竿滨,你說(shuō)我怎么就攤上這事∧缶常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵毁葱,是天一觀的道長(zhǎng)垫言。 經(jīng)常有香客問(wèn)我,道長(zhǎng)倾剿,這世上最難降的妖魔是什么筷频? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮前痘,結(jié)果婚禮上凛捏,老公的妹妹穿的比我還像新娘。我一直安慰自己芹缔,他們只是感情好坯癣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著最欠,像睡著了一般示罗。 火紅的嫁衣襯著肌膚如雪惩猫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天蚜点,我揣著相機(jī)與錄音轧房,去河邊找鬼。 笑死绍绘,一個(gè)胖子當(dāng)著我的面吹牛奶镶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陪拘,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厂镇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了藻丢?” 一聲冷哼從身側(cè)響起剪撬,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悠反,沒(méi)想到半個(gè)月后残黑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斋否,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年梨水,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茵臭。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疫诽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旦委,到底是詐尸還是另有隱情奇徒,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布缨硝,位于F島的核電站摩钙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏查辩。R本人自食惡果不足惜胖笛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宜岛。 院中可真熱鬧长踊,春花似錦、人聲如沸萍倡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至佑刷,卻和暖如春莉擒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瘫絮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工涨冀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麦萤。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓鹿鳖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親壮莹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翅帜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的涝滴。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,473評(píng)論 1 11
  • 在處理表單登錄的過(guò)程中胶台,遇到了一個(gè)問(wèn)題歼疮,當(dāng)我們?cè)谳斎肟蜉斎雰?nèi)容輸入框獲取到焦點(diǎn)時(shí),輸入框后面會(huì)出現(xiàn)一個(gè)圖標(biāo)刪除已輸...
    菜菜___閱讀 9,775評(píng)論 0 16
  • (續(xù)jQuery基礎(chǔ)(1)) 第5章 DOM節(jié)點(diǎn)的復(fù)制與替換 (1)DOM拷貝clone() 克隆節(jié)點(diǎn)是DOM的常...
    凜0_0閱讀 1,318評(píng)論 0 8
  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,595評(píng)論 2 10
  • //------------------------- 第一章 認(rèn)識(shí)JQuery ----------------...
    米塔塔閱讀 701評(píng)論 0 9