使用 Layer 彈窗,點擊「確認」正常彈出提示,但點擊「取消」按鈕(`no` 回調)無任何反應,不彈出「您選擇了取消」提示。
layer.open({
content: '您確認取消認購?',
btn: ['確認', '取消'],
shadeClose: false,
yes: function() {
layer.open({content: '確認取消認購', time: 1});
},
no: function() {
layer.open({content: '您選擇了取消', time: 1});
}
});
Layer 內部機制衝突:
no: function() {
setTimeout(function() {
// 500ms 後再彈出,等待舊彈窗完全銷毀
layer.open({content: '您選擇了取消', time: 1});
}, 500);
}
// 通用 Layer 確認對話框
function layerConfirm(options) {
const defaults = {
title: '提示',
btn: ['確定', '取消'],
shadeClose: false,
yes: function(index, layero) {
options.onConfirm?.(index, layero);
layer.close(index);
},
no: function(index, layero) {
// 統一延時處理,避免衝突
setTimeout(() => {
options.onCancel?.(index, layero);
}, 300);
}
};
layer.open({...defaults, ...options, content: options.content});
}
// 使用示例
layerConfirm({
content: '您確認取消認購?',
onConfirm: function() {
layer.msg('確認取消認購');
// 執行取消認購業務邏輯
},
onCancel: function() {
layer.msg('您選擇了取消');
}
});
| 場景 | 建議延時 | 理由 |
|---|---|---|
| 簡單提示彈窗 | 300-500ms | Layer 關閉動畫約 200-300ms |
| 複雜表單彈窗 | 500-800ms | DOM 結構複雜,銷毀耗時較長 |
| iframe 頁面層 | 800-1000ms | iframe 卸載、父頁面重排需更多時間 |
通用原則:在關閉動畫完成前避免創建新彈窗,使用宏任務延時。