【问题标题】:Access DOM elements inside iframe from chrome extension从 chrome 扩展访问 iframe 内的 DOM 元素
【发布时间】:2017-05-04 16:54:40
【问题描述】:

有没有办法访问 iframe 中的 DOM 元素而不会出现跨域错误?
基本上,我希望能够从我的扩展程序中单击 iframe 内的按钮来启动视频。

我真的不知道如何继续,我尝试了iframe.contentDocument,但我得到了跨域错误。

background.js:

chrome.tabs.executeScript({
    "file": "script.js",
    "allFrames" : true
});

script.js

var iframe = document.getElementById("iframeId");
var button = iframe.contentDocument.getElementsById("buttonId");

我得到的错误:
Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "https://website.com" from accessing a cross-origin frame.

谢谢

【问题讨论】:

  • edit 成为主题的问题:包括一个完整 minimal reproducible example 重复问题。包括一个manifest.json,一些背景/内容/弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码不工作?”)必须包括:►期望的行为,►特定问题或错误►必要的最短代码重现它在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:“如何创建 minimal reproducible example”、What topics can I ask about here?How to Ask
  • @Makyen 你想让我在我的问题中添加什么?什么不清楚?
  • 需要minimal reproducible example 的原因是我们想提供帮助。如果我们不必重新创建复制问题所需的任何代码,那么提供帮助会要容易得多。这是您已经拥有的代码。因此,请帮助我们为您提供帮助并提供一个完整 minimal reproducible example,以重复此类问题的问题。如果没有minimal reproducible example,甚至开始帮助您所需的努力量大大更高,这显着减少了愿意/能够帮助您的人数。即使我们付出了额外的努力,我们也必须猜测您可能遇到的问题的很大一部分。
  • @Makyen 我添加了一些代码,但我认为这不是很有用

标签: javascript google-chrome iframe google-chrome-extension


【解决方案1】:

蛮力:在 iframe 中注入脚本

如果您在访问 iframe 的内容时遇到问题,暴力破解方法是将 content script 直接注入 iframe 并从该内容脚本访问 iframe。

注入单个帧:
您可以通过在对chrome.tabs.executeScript() 的调用中提供帧 ID 来显式指定注入脚本的帧。这可能是这样的:

chrome.tabs.executeScript(tabOfInterestId,{
    frameId: frameIdToInject,
    file: scriptFileWhichDoesWhatIWantInTheIframe.js
},function(results){
    //Handle any results
});

如果您不知道要注入的帧的帧 ID,可以从 chrome.webNavigation.getAllFrames() 获取,例如:

chrome.webNavigation.getAllFrames({tabId:tabOfInterestId},function(frames){
    //Do what you want with the array of frame descriptor Objects
});

注入所有帧:
如果您想注入选项卡中的所有框架,您可以执行您已经在做的问题中显示的操作:

chrome.tabs.executeScript({
    "file": "script.js",
    "allFrames" : true
});

这会将 script.js 文件注入到当前窗口的活动选项卡中的所有框架中在执行tabs.executeScript() 调用时存在script.js 的不同副本将被注入选项卡内的每个框架中,包括基本框架。这不会在调用 tabs.executeScript() 后添加到选项卡的任何 iframe 中注入 script.js。对于 iframe,在 iframe 的 URL 更改(例如 src 属性更改)或父框架(例如选项卡的基本框架)之前,注入脚本所在的上下文将是有效的(即脚本将存在) ) 更改 URL(即在父框架中加载新页面)。

【讨论】:

  • 非常感谢,这正是我所需要的
  • 我只有最后一个问题.. 是否可以在非活动选项卡中触发 DOM 事件?例如,在与活动选项卡不同的选项卡中触发按钮的click() 事件。
  • @DavidSeroussi,是的,您可以从该页面中已有的内容脚本或为此目的在该页面中注入的内容脚本执行此操作,即使选项卡是不是当时的活动标签。在用户单击浏览器 UI 按钮时注入不是活动选项卡的选项卡需要您已声明匹配 URL 的权限。
  • 好的,但是你知道为什么 youtube 视频只有在它包含的标签被选中时才会启动? Because I my script clicks the play button of a media player and it works well when the tab is active, but when the tab is inactive the video won't launch until the tab is focus once.感谢您的帮助
  • 所以经过一些研究后,我发现 chrome 在标签聚焦之前会暂停任何媒体。我通过在 chromium 45 上尝试我的扩展来确认这种行为,并且一切正常。您知道如何禁用此“媒体暂停”吗?还是我应该问一个新问题?
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2012-10-27
  • 2011-04-25
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多