我已使用 "all_frames": true
将内容脚本文件注入(inject)到所有页面和内部 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({...});
});
我已检查内容脚本是否在内部框架中运行。
我正在尝试检索可能位于内部框架中的文本选择。
(顺便说一句,我不喜欢通过每个内容脚本打开连接,这是一个很大的开销。)
最佳答案
问题是一个选项卡只能有一个 onRequest
监听器。因此,如果您想仅 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。我不确定你的意思I prefer not to open connection by every and all content script
但是如果您想按需注入(inject)内容脚本,可以使用chrome.tabs.executeScript()
。
关于google-chrome-extension - Chrome 扩展程序 : sendRequest to content script inside inner iframes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392309/