許多初學者在父頁面嘗試用 jQuery 選取器直接跨 iframe 訪問 EasyUI 元件:
// 錯誤寫法
$('#ss_frame').contentWindow.$('#dgMANUF').datagrid('getSelected');
// 錯誤原因:jQuery 物件無 contentWindow 屬性,會拋出 "無法獲取屬性 nodeName" 錯誤
document.getElementById('ss_frame').contentWindow.$('#dgMANUF').datagrid('getSelected');
$.find('iframe')[0].contentWindow.$('#dgMANUF').datagrid('getSelected');
核心原則:先取得 iframe 的 contentWindow,再在該視窗上下文中使用 jQuery/EasyUI API。
動態設定 iframe.src 後,腳本立即執行會因頁面未載入完成而失敗。
在子頁面 (iframe 內) 的 <body onload="..."> 或 $(document).ready() 中通知父頁面:
// 子頁面
window.parent.iframeLoaded = true; // 或呼叫父頁面回呼函數
父頁面輪詢或事件驅動等待:
// 父頁面
var checkLoaded = setInterval(function() {
var frame = document.getElementById('ss_frame');
if (frame.contentWindow.iframeLoaded) {
clearInterval(checkLoaded);
// 此處安全呼叫 EasyUI API
frame.contentWindow.$('#dgMANUF').datagrid('reload');
}
}, 100);
document.getElementById('ss_frame').contentWindow.document.write('loading...');
強制瀏覽器開始解析 iframe 內容,但無法保證 EasyUI 元件已初始化完成,建議採用上述回呼機制。
contentWindow 存取會被瀏覽器阻擋,需用 postMessage 通訊。datagrid('destroy') 釋放資源,避免記憶體洩漏。