現象:AJAX 成功返回 HTML 片段,JS 執行 document.write(responseText) 後,頁面內容正常顯示,但 Firefox 標籤頁持續顯示「加載中」旋轉圖標,Console 無報錯。
document.write() 向該流寫入內容DOMContentLoaded、load 事件)document.write() 會隱式 document.open() 打開新流,覆蓋原文檔document.close(),Firefox 認為文檔仍在加載中,持續旋轉
// AJAX 成功回調中
document.write(responseText);
document.close(); // 【關鍵】顯式關閉文檔流,通知瀏覽器加載完成
$.ajax({
url: '/api/content',
method: 'GET',
success: function(html) {
// 1. 寫入新內容
document.write(html);
// 2. 必須關閉流
document.close();
// 3. (可選) 手動觸發頁面級事件,確保第三方庫初始化
window.dispatchEvent(new Event('load'));
document.dispatchEvent(new Event('DOMContentLoaded'));
},
error: function(xhr) {
// 錯誤處理:恢復原頁面或提示
document.write('加載失敗:' + xhr.status);
document.close();
}
});
document.write 會覆蓋整個文檔,破壞原有 DOM、事件綁定、CSSOM,副作用大。現代開發建議:
// 容器元素替換 innerHTML
$('#container').html(responseText);
// 或原生
document.getElementById('container').innerHTML = responseText;
// 配合 script 標籤手動執行(innerHTML 不執行 script)
const scripts = container.querySelectorAll('script');
scripts.forEach(s => eval(s.textContent)); // 或動態創建 script 標籤
凡用 document.write,必配 document.close()。 否則 Firefox 標籤頁永久旋轉,用戶以為頁面卡死。現代項目請棄用 document.write,改用 DOM API 精準替換局部內容。