將 WebUploader 放入 Bootstrap 的 .tab-content 結構中,且該分頁非預設顯示(即 display: none 狀態)時,點擊「選擇檔案」按鈕無任何反應,無法彈出檔案選擇對話框。
WebUploader 初始化時會綁定點擊事件並計算內部按鈕的幾何位置。若容器處於隱藏狀態(display: none),元素寬高為 0、座標不可計算,導致事件綁定失效或按鈕定位錯誤,進而無法觸發原生 <input type="file">。
利用 Bootstrap Tab 的 shown.bs.tab 事件,該事件在分頁切換動畫完成、內容真正可見時觸發。此時重新實例化 WebUploader 即可獲得正確的 DOM 尺寸與座標。
// 將初始化邏輯封裝為可複用函數
function initUploader() {
var uploader = WebUploader.create({
// ... 原有配置 ...
pick: '#filePicker',
// 重要:指定容器為當前可見的 tab-pane,避免多實例衝突
container: '#product_gallary .uploader-container'
});
// 視專案需求保存實例供後續銷毀
window.currentUploader = uploader;
}
// 監聽 Tab 切換
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
// e.target 為被激活的 元素,其 href 屬性即目標 tab-pane 的 id
var targetId = $(e.target).attr('href'); // 例如 "#product_gallary"
// 僅在目標分頁需要上傳功能時初始化
if (targetId === '#product_gallary') {
// 若已有實例先銷毀,防止重複綁定
if (window.currentUploader) {
window.currentUploader.destroy();
}
initUploader();
}
});
uploader.destroy(),避免事件重複綁定、記憶體洩漏。container 選項限制 WebUploader 的 DOM 範圍,防止多標籤頁共用同一選擇器造成衝突。$(e.target).attr('href') 直接獲得 #product_gallary,比手動解析 e.target.toString() 更可靠。事件名稱變更為 shown.bs.tab(相同),但需改用原生 data-bs-toggle="tab" 選擇器:
document.querySelectorAll('[data-bs-toggle="tab"]').forEach(el => {
el.addEventListener('shown.bs.tab', e => { /* 同邏輯 */ });
});
隱藏容器導致 WebUploader 初始化失效,核心對策是在容器可見時才初始化。善用 shown.bs.tab 事件配合實例銷毀/重建機制,即可在動態分頁場景下穩定運作。