頁面嵌入同域 `
當主頁與 iframe 頁面協議、域名、端口完全一致時,可通過 `iframe.contentWindow.document` 或 `iframe.contentDocument` 直接操作內部 DOM。
<iframe id="targetFrame" src="inner.html" onload="hideImages(this)"></iframe>
<script>
function hideImages(iframe) {
try {
// 獲取 iframe 內部 document
var doc = iframe.contentDocument || iframe.contentWindow.document;
if (!doc) return; // 跨域或未加載完成會拋異常/返回 null
var imgs = doc.getElementsByTagName('img');
for (var i = 0; i < imgs.length; i++) {
imgs[i].style.display = 'none'; // 或 imgs[i].hidden = true (HTML5)
}
} catch (e) {
console.error('iframe 操作失敗,可能跨域或文檔未就緒:', e);
}
}
</script>
function injectStyle(iframe, cssText) {
var doc = iframe.contentDocument || iframe.contentWindow.document;
if (!doc) return;
var style = doc.createElement('style');
style.type = 'text/css';
style.appendChild(doc.createTextNode(cssText));
(doc.head || doc.documentElement).appendChild(style);
}
// 使用示例:隱藏圖片 + 修改背景色
injectStyle(document.getElementById('targetFrame'),
'img { display: none !important; } body { background: #f5f5f5; }');
| 問題 | 原因 | 解決 |
|---|---|---|
| 報錯「Permission denied / Blocked a frame」 | 跨域(域名/端口/協議不一致) | 確保同域;或在雙方頁面設置 document.domain = 'base.com'(僅限同主域);或用 postMessage 通信 |
| contentDocument 為 null | iframe 尚未加載完成 | 綁定 onload 事件後再操作 |
| 本地文件無法操作 | Chrome/Edge 禁止 file:// 協議跨文檔訪問 | 啟動本地 HTTP 服務(如 `python -m http.server` / `npx serve`) |
| 動態添加的元素未生效 | iframe 內部 JS 後渲染 | 在 iframe 內部監聽 DOMContentLoaded 或使用 MutationObserver 持續注入 |
iframeReady(iframe, callback) 工具函數,統一處理加載時序與異常。