Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从chrome扩展访问iframe中的DOM元素_Javascript_Google Chrome_Iframe_Google Chrome Extension - Fatal编程技术网

Javascript 从chrome扩展访问iframe中的DOM元素

Javascript 从chrome扩展访问iframe中的DOM元素,javascript,google-chrome,iframe,google-chrome-extension,Javascript,Google Chrome,Iframe,Google Chrome Extension,有没有一种方法可以访问iframe中的DOM元素而不产生跨源错误? 基本上,我希望能够单击iframe内的按钮,从我的扩展启动视频 我真的不知道如何继续,我已经尝试了iframe.contentDocument,但是我得到了跨原点错误 background.js: script.js: 我得到的错误: Uncaught DomeException:未能从“HTMLIFrameElement”读取“contentDocument”属性:已阻止具有源代码的帧”https://website.com“

有没有一种方法可以访问iframe中的DOM元素而不产生跨源错误?
基本上,我希望能够单击iframe内的按钮,从我的扩展启动视频

我真的不知道如何继续,我已经尝试了
iframe.contentDocument
,但是我得到了跨原点错误

background.js:

script.js:

我得到的错误:
Uncaught DomeException:未能从“HTMLIFrameElement”读取“contentDocument”属性:已阻止具有源代码的帧”https://website.com“从访问交叉原点帧开始。

谢谢

暴力:在iframe中注入脚本 如果您在访问iframe的内容时遇到问题,那么使用蛮力方法可以将直接插入iframe并从该内容脚本访问iframe

注入到单个帧中:
通过在对的调用中提供帧ID,可以显式指定脚本注入的帧。这可能类似于:

chrome.tabs.executeScript(tabOfInterestId{
frameId:frameIdToInject,
文件:scriptfilewhichdoeswhatiwantitheiframe.js
},功能(结果){
//处理任何结果
});
如果您不知道要注入的帧的帧ID,您可以通过以下方式获得:

chrome.webNavigation.getAllFrames({tabId:tabOfInterestId},函数(frames){
//对帧描述符对象数组执行所需操作
});
注入所有帧:
如果要插入选项卡中的所有帧,可以执行问题中显示的已在执行的操作:

chrome.tabs.executeScript({
“文件”:“script.js”,
“所有帧”:正确
});

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

请选择主题问题:包括一个与问题重复的完整问题。包括manifest.json、一些后台/内容/弹出脚本/HTML。寻求调试帮助的问题(“为什么此代码不工作?”)必须包括:►想要的行为,►特定的问题或错误,以及►在问题本身中复制它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:“如何创建”,以及。@Makyen您希望我在我的问题中添加什么?什么是不清楚的?需要a的原因是我们想要帮助。如果我们不必重新创建复制问题所需的任何代码,那么帮助就容易多了。这是您已经拥有的代码。因此,请帮助我们帮助您,并提供一份完整的报告,以重复此类问题的问题。如果没有帮助,甚至开始帮助你所需的努力量也要高得多,这大大减少了愿意/能够帮助你的人数。即使我们付出了额外的努力,我们也必须猜测你的问题的重要部分。@Makyen我添加了一些代码,但我不认为这真的有用。非常感谢,这正是我需要的。我只有最后一个问题。。是否可以在非活动选项卡中触发DOM事件?例如,激活一个按钮的
click()
事件,该按钮位于与活动选项卡不同的选项卡上。@davidserosi,是的,您可以从该页面中已经存在的内容脚本中执行此操作,或者从为执行此操作而插入该页面的内容脚本中执行此操作,即使该选项卡当时不是活动选项卡。在用户单击浏览器UI按钮时,如果要插入一个不是活动选项卡的选项卡,则需要您为匹配的URL声明权限。好的,但是您知道为什么只有在选中包含youtube视频的选项卡时才会启动该视频吗?因为我的脚本单击了媒体播放器的“播放”按钮,当选项卡处于活动状态时效果很好,但当选项卡处于非活动状态时,只有在选项卡对焦一次后,视频才会启动。感谢您的帮助,所以经过一些研究,我发现chrome会在选项卡聚焦之前暂停任何媒体。。我通过在chromium 45上尝试我的扩展来证实这一行为,并且一切正常。您知道如何禁用此“媒体暂停”吗?还是我应该问一个新问题?
chrome.tabs.executeScript({
    "file": "script.js",
    "allFrames" : true
});
var iframe = document.getElementById("iframeId");
var button = iframe.contentDocument.getElementsById("buttonId");