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

JavaScript 空格鍵防抖:標記位模式避免重複彈窗

     編輯:程式設計綜合問答

現象:`keydown` 事件持續觸發,`alert` 阻塞主線程導致隊列堆積,彈窗關閉後連續彈出。

根因

`alert` 是同步阻塞 API,瀏覽器在彈窗期間**不處理新事件**,但鍵盤按住不放會產生**重複 keydown**,排隊等待彈窗關閉後依次執行。

解決方案:標記位互斥

let spaceHandled = false;

document.addEventListener('keydown', function(e) {
    if (e.code === 'Space') {
        if (spaceHandled) return; // 已在處理中,忽略
        spaceHandled = true;
        
        alert('不能添加空格');
        
        // 彈窗關閉後釋放鎖(需異步釋放,避免同步代碼仍在執行)
        setTimeout(() => spaceHandled = false, 0);
    }
});

進階:防抖工具函數封裝

function debounceAction(key, action, wait = 300) {
    let timer = null, running = false;
    return function(e) {
        if (e.code !== key) return;
        if (running) return;
        running = true;
        action(e);
        clearTimeout(timer);
        timer = setTimeout(() => running = false, wait);
    };
}

// 使用
document.addEventListener('keydown', debounceAction('Space', e => {
    alert('不能添加空格');
}, 1000)); // 1秒內不再觸發

最佳實踐:替換 alert 為非阻塞提示

`alert`/`confirm`/`prompt` 會阻塞事件循環,體驗極差。推薦:

  • Toast 輕提示:`toastr.warning('不能添加空格')`
  • 內聯錯誤訊息:`不能添加空格` 顯示 2 秒後淡出。
  • 輸入框原生驗證:`` + CSS `:invalid` 樣式。

關鍵點總結

方案優點缺點
標記位鎖零依賴、邏輯簡單需手動管理釋放時機
防抖封裝可復用、支持配置等待時間略增代碼量
非阻塞 UI體驗最佳、不阻塞主線程需引入組件庫或自寫樣式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved