首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

下拉選單:解決 li 點擊事件與 input blur 事件衝突

     編輯:程式設計綜合問答

問題現象

模擬百度搜索下拉:點擊 `

  • ` 選項時,需填充輸入框並隱藏下拉層。但 `` 的 `onblur`(失去焦點)會先於 `
  • ` 的 `onclick` 觸發,導致下拉層提前隱藏,點擊事件失效。

    核心解決方案:blur 處理器延時執行

    // 輸入框 blur 事件
    $input.on('blur', function() {
        // 關鍵:給予 click 事件足夠時間觸發
        setTimeout(() => {
            $dropdown.hide();
        }, 200); // 200ms 經驗值,足夠覆蓋用戶點擊延遲
    });
    
    // 下拉選項 click 事件
    $dropdown.on('click', 'li', function() {
        $input.val($(this).text()).focus(); // 填充並保持焦點,阻止 blur
        // 業務邏輯...
    });

    原理說明

    瀏覽器事件循環中,`mousedown` → `blur` → `click`。`setTimeout` 將隱藏操作推入下一個宏任務,使 `click` 處理器能在同一輪事件循環內完成填充並調用 `focus()` 重新獲取焦點,從而取消後續的 `blur` 隱藏邏輯。

    進階替代方案

    • mousedown 攔截:在下拉層綁定 `mousedown` 並 `e.preventDefault()`,阻止輸入框失去焦點(需注意文本選中等副作用)。
    • focusin/focusout:使用不冒泡的焦點事件配合 `relatedTarget` 判斷焦點是否移至下拉層內部。

    推薦使用 `setTimeout` 方案,簡單兼容性好。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved