【问题标题】:Chrome Extension: sendRequest to content script inside inner iframes?Chrome 扩展:将请求发送到内部 iframe 内的内容脚本?
【发布时间】:2011-09-17 13:13:04
【问题描述】:

我已经使用"all_frames": true 向所有页面和内部 iframe 注入了一个内容脚本文件,但是当我从弹出窗口发送请求时,只有顶部窗口正在接收它。知道如何将其发送到所有内部框架或至少最后一个焦点窗口/文档吗?

Popup.html (page action):
===========
chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.sendRequest(tab.id, {...}, function(response) {...});
});

content_script.js
=================
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    sendResponse({...});
});

我已检查内容脚本是否在内框架中工作。

我正在尝试检索可能在内部框架中的文本选择。

(顺便说一句,我不希望通过所有内容脚本打开连接,这是一个很大的开销。)

【问题讨论】:

  • 在 Firefox 中,我只需要 document.commandDispatcher.focusedWindowdocument.commandDispatcher.focusedElement

标签: google-chrome-extension chromium


【解决方案1】:

问题是一个标签只能有一个onRequest 监听器。因此,如果您想向 only iframe 脚本发送消息,并且页面上只有 一个 iframe,那么您应该只在 iframe 内创建一个侦听器:

//listen to requests only inside iframe
if(window!=window.top) {
    chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
        ...
    });
}

现在,如果您想向 父页面和 iframe 发送请求,或者页面上有 许多 个 iframe 需要监听请求 - 您需要沟通通过ports

端口仍然有类似的限制 - 只会调用一个端口侦听器,但您可以打开多个端口。如果父页面只有一个 iframe - 您只需在两个不同端口上打开两个连接。但是,如果页面上有很多 iframe,并且每个 iframe 都有子框架 - 您需要先枚举所有 iframe 以为每个 iframe 创建唯一的端口。

PS。我不确定你的意思是什么

我不希望通过所有内容脚本打开连接

但如果你想按需注入内容脚本,有chrome.tabs.executeScript()

【讨论】:

  • 谢谢,我使用您建议的executeScript() 而不是sendRequest() 与所有内部框架进行通信,它们使用sendRequest() 发回响应。
猜你喜欢
  • 2011-09-28
  • 2014-03-04
  • 2012-07-04
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
相关资源
最近更新 更多