需求:按 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.alert 完美替代原生。| 缺點 | 影響 |
|---|---|
| 無法自定義樣式 | 品牌一致性差 |
| 同步阻塞主線程 | 定時器、動畫、網絡請求全凍結 |
| 無法檢測/關閉 | 無法實現防重複、自動關閉等高級交互 |
| 移動端體驗極差 | iOS Safari 甚至不顯示標題 |