在 iframe 的文档和/或 shadow-root 中注入 html dom

Posted

技术标签:

【中文标题】在 iframe 的文档和/或 shadow-root 中注入 html dom【英文标题】:Injecting html dom inside iframe's document and/or shadow-root 【发布时间】:2018-10-02 23:46:14 【问题描述】:

我正在使用 javascript(使用 chrome 扩展)将 iframe 注入网页。使用 javascript,我正在创建 iframe,我可以访问我的 html 的 url,所以我可以使用 $.get 获取 DOM

var elt = document.createElement('iframe');
elt.id = 'my_iframe';

$.get(chrome.extension.getURL('views/test.html'), function(doc) 

    var container = document.querySelector('#my_iframe');

    console.log(container.documentContent);  // can access
    console.log(container.shadowRoot); // can't access

    // ideally:
    container.shadowRoot($(doc));
    container.contentDocument($(doc));

);

document.getElementsByTagName('body')[0].appendChild(elt);

如何在#shadow-root 中注入我的“text.html”?

原因是,当我使用 elt.src = url 时,它不会将 html 内容包装在 #document#shadow-root 中,这会导致错误 - (未包装在 @987654330 中时 iframe 中的内容模糊@ 或#shadow-root - bug report)

【问题讨论】:

您到底想要发生什么?你想通过 shadow-root 设置 iframe 的内容吗?你不能影子 root 是只读的 我也可以更改注入的.html。我需要这个的原因是因为当我使用iframe.src = chrome.extension.getURL('views/test.html'); 时,它不会生成#document#shadow-root,所以由于某种原因它会变得模糊。我需要一种方法将我的内容放入 #shadow-root 当我使用 elt.src = url; 时,它不会将 iframe 内容包装在 #document#shadow-root 【参考方案1】:

如果您只是更改 iframe 的内容,您可以这样做:

const iframe = document.querySelector('#myIframe')
iframe.outerHTML = '<iframe></iframe>' // clears the iframe
iframe.contentDocument.open()
iframe.contentDocument.write(yourHTMLText)
iframe.contentDocument.close()

【讨论】:

这不会将外部 html 放在 #document#shadow-root 中。这不等于iframe.src = url吗? 你需要shadow-root做什么? 当 iframe 内容不在 #document#shadow-root 内时,它会变得模糊。 Here is my bug report 我的回答确实将内容放入了#document 我无法完成这项工作。我试过container.contentDocument.write("&lt;h1&gt;Hello&lt;/h1&gt;"),但没有运气。它删除现有的 iframe,并创建一个新的 iframe,并且不放置任何内容。如果为空也可以得到content.js:30 Uncaught TypeError: Cannot read property 'open' of null`

以上是关于在 iframe 的文档和/或 shadow-root 中注入 html dom的主要内容,如果未能解决你的问题,请参考以下文章

更改 iFrame 的字体大小和字体系列

jsWindow 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,

是否可以为 iframe 设置 Origin Header?

selenium自动化测试-处理iframe

window对象(contentWindow)

iframe 元素会创建包含另外一个文档的内联框架(即行内框架)