Google chrome extension 从chrome扩展访问/编辑iframe的内容

Google chrome extension 从chrome扩展访问/编辑iframe的内容,google-chrome-extension,Google Chrome Extension,我想通过chrome扩展编辑iframe的内容,但无法编辑,因为iframe的contentWindow/contentDocument返回未定义的内容。 我一直在四处寻找答案,据我所知,如果iframe从一开始就存在于页面上,那么它很容易修复,但事实并非如此。 所讨论的iframe是gmail撰写文本区域,它以iframe的形式出现,并动态添加到DOM中。 有没有办法通过chrome扩展来做到这一点 编辑: 我很抱歉。 Rob W让我意识到contentDocument确实可以访问。我在这里尝

我想通过chrome扩展编辑iframe的内容,但无法编辑,因为iframe的contentWindow/contentDocument返回未定义的内容。 我一直在四处寻找答案,据我所知,如果iframe从一开始就存在于页面上,那么它很容易修复,但事实并非如此。 所讨论的iframe是gmail撰写文本区域,它以iframe的形式出现,并动态添加到DOM中。 有没有办法通过chrome扩展来做到这一点

编辑: 我很抱歉。 Rob W让我意识到contentDocument确实可以访问。我在这里尝试的是在Gmail中添加一些额外的功能,在工具栏中有一个按钮,可以在compose窗口中添加一些html。我现在让按钮部分工作,它添加了html,但它没有像预期的那样在插入符号处执行,因为我无法访问contentWindow来执行此操作:

range = iWindow.getSelection().getRangeAt(0);
node = range.createContextualFragment(html);
range.insertNode(node);
有什么解决办法吗?


另一方面,
contentDocument
,只要iframe位于同一原点,就可以正确返回框架内的文档,Gmail就是这样

下面是Gmail的一个例子。为了简单起见,我假设文档中只有一个编辑器

var poller = setInterval(function() {
    var editor = document.querySelector('iframe.editable');
    if (editor && editor.contentDocument && !editor.__rwHandled) {
        editor.__rwHandled = true; // Run once for an editor instance
        var textNode = document.createTextNode('It works!');
        editor.contentDocument.body.appendChild(textNode);
    }
}, 200);

当你想停止轮询器时,只需使用
clearInterval(轮询器)。确保检测方法便宜。例如:查询DOM节点可以,打开新窗口则不行。

谢谢您的回答。我对我的问题做了修改。对不起,我确信这是因为我没有足够的经验,但我不能真正理解你的答案。我做了很多尝试,并尝试使用executeScript在iframe中添加contentscript,但我真的无法让它工作。很抱歉,我非常感谢您的帮助。@Clox这是因为您的代码确实需要访问窗口对象,才能使用
window.getSelection()。这正是你想要的。如果你想在页面和内容脚本之间进行通信,可以设置一个自定义事件或脚本;如果将鼠标移到主电子邮件列表视图中的发件人上方,您会看到一个小框(他们显然称之为悬停卡)。此框由iframe从以下位置加载创建:…-您可以使用“所有_帧”影响这些iFrame:true