google-chrome-extension - Chrome 扩展程序 : sendRequest to content script inside inner iframes?

标签 google-chrome-extension chromium

我已使用 "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/

相关文章:

javascript - 如何在 Google Chrome 扩展中使用 Service Worker 来修改 HTTP 响应体?

google-chrome - 在 Chrome 扩展程序网上应用店列表中更改 "from [name]"/"offered by [name]"

node.js - 将Electron + Puppeteer打包为.exe

html - 无法选择 3d css 立方体面内的元素。奇怪的

javascript - 为什么选择具有值(value)的输入会触发 Chrome 中的两个事件?

javascript - 后台 Chrome 扩展 list V3 库

google-chrome - 如何在本地测试 Chromium/Chrome 扩展的内联安装?

javascript - 我可以判断我的 Chrome 扩展程序是否在 Windows 上运行吗?

javascript - Dart应用和跨域策略

java - 如果 Selenium 驱动程序找不到元素(If - else if)继续,但它会抛出找不到元素错误