在瀏覽器控制台檢查 window 對象時,發現自定義屬性 hasLoaded 和 loading,疑惑其含義。
// 頁面入口腳本
if (window.hasLoaded) {
console.log('頁面邏輯已初始化,跳過重複執行');
} else {
window.loading = true; // 標記正在加載
initApp().then(() => {
window.loading = false;
window.hasLoaded = true; // 標記加載完成
});
}
// 其他腳本檢查狀態
function useSharedResource() {
if (window.loading) {
// 等待初始化完成
return waitFor(() => !window.loading).then(useSharedResource);
}
if (!window.hasLoaded) {
throw new Error('核心模塊未就緒');
}
// 正常使用共享資源
}
| 機制 | 觸發時機 | 適用場景 |
|---|---|---|
window.onload | 所有資源 (圖片、CSS、JS) 加載完成 | 需等待圖片尺寸計算等 |
DOMContentLoaded | DOM 解析完成,不等待資源 | 早期初始化 UI、綁定事件 |
window.hasLoaded (自定義) | 業務邏輯初始化完成 (可異步) | 模塊間依賴協調、單頁應用路由守衛 |
window.MYAPP_hasLoaded。window.appReady = initApp(),其他模塊 await window.appReady。// 控制台查看所有自定義 window 屬性
Object.keys(window).filter(k => !['chrome','document','navigator'...].includes(k))