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

JS 判斷 alert 對話框是否彈出:原生 alert 無法檢測,需自定義模態層

     編輯:程式設計綜合問答

需求:按 Enter 提交表單,若彈出「不能為空」原生 alert,連續按 Enter 會疊加彈窗。想檢測 alert 是否打開並阻止重複提交。

核心事實

原生 `alert/confirm/prompt` 是瀏覽器級同步阻塞 UI,JS 無法檢測其打開狀態,也無法程序化關閉。 這是瀏覽器安全機制決定的。

解決方案:替換為自定義模態組件

// 1. 全局狀態標記
let dialogOpen = false;

// 2. 封裝自定義彈窗
function showMsg(msg) {
    if (dialogOpen) return; // 防重複
    dialogOpen = true;
    // 這裡用任意 UI 庫:layer, sweetalert2, bootstrap-modal, 或手寫 DOM
    layer.alert(msg, {
        closeBtn: 0,
        end: () => { dialogOpen = false; } // 關閉回調重置標記
    });
}

// 3. 綁定 Enter 鍵
$(document).keyup(e => {
    if (e.keyCode === 13 && !dialogOpen) {
        $('#submitBtn').trigger('click');
    }
});

// 4. 表單驗證調用 showMsg 而非 alert
if (!name) { showMsg('姓名不能為空'); return; }

推薦輕量庫

  • layer:國產、無依賴、API 極簡、layer.alert 完美替代原生。
  • SweetAlert2:美觀、Promise API、支持鏈式調用。
  • Bootstrap Modal / Ant Design Modal:項目已用對應 UI 框架時首選。

為什麼不用原生 alert?

結論:生產項目禁用原生 alert/confirm,統一接入可控的模態組件,在組件層面管理打開狀態、防抖、可訪問性,才是專業前端工程化做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
缺點影響
無法自定義樣式品牌一致性差
同步阻塞主線程定時器、動畫、網絡請求全凍結
無法檢測/關閉無法實現防重複、自動關閉等高級交互
移動端體驗極差iOS Safari 甚至不顯示標題