当前位置: 首页 > 知识库问答 >
问题:

chrome - 浏览器扩展通信问题为什么只有特定页面可行,其它页面报错(Could not establish connection. Receiving end does not exist)?

公孙鸿才
2023-09-08
  • 写了个网页音乐播放器扩展,本意是想不需要切换到音乐网页去点击切换歌曲,希望扩展在任意网页点击可切换该音乐网页的歌曲。
  • 现在遇到的问题是,扩展在在那个音乐网页就可以正常使用(=.=),在其它网页都报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

manifest.json

{    "name": "播放器",    "version": "0.0.0.1",    "manifest_version": 3,    "description": "用于切换播放模式及控制下一首歌曲的扩展程序",    "icons": {        "128": "icons/128x128.png"    },    "action": {        "default_popup": "popup/popup.html"    },    "content_scripts": [{        "matches": ["音乐播放网页"],        "js": ["lib/jquery.min.js", "content-scripts/content.js"]    }],    "externally_connectable": {        "ids": ["ebjnejafkk*********plickhfn"],        "matches": ["音乐播放网页"]    },    "permissions": [        "tabs",        "scripting"    ],    "web_accessible_resources": [{        "resources": ["images/*.jpeg"],        "matches": ["<all_urls>"]    }]}

content.js

//向扩展(popup.js)发送消息 chrome.runtime.sendMessage()// 接收来自扩展(popup.js)的消息 chrome.runtime.onMessage.addListener()

popup.js

//向content.js(即音乐网页)发送消息 chrome.tabs.sendMessage()//接收来自content.js(即音乐网页)的消息chrome.runtime.onMessage.addListener

共有2个答案

董俊晖
2023-09-08

之前一直不懂为什么popup与content可以通信,为什么只有特定页面能行的通,虽然楼上给了解决方案,但是还是不知道为什么。最后看到这篇博主的文才明白【干货】Chrome插件(扩展)开发全攻略

  • content_scripts向popup主动发消息的前提是popup必须打开!否则需要利用background作中转;
  • 如果background和popup同时监听,那么它们都可以同时收到消息,但是只有一个可以sendResponse,一个先发送了,那么另外一个再发送就无效;
董宜然
2023-09-08
"background": {    "service_worker": "background.js"},

然后,在background.js:

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {    if (message.from === 'popup') {        chrome.tabs.query({url: '音乐播放网页URL'}, (tabs) => {            if (tabs.length) {                chrome.tabs.sendMessage(tabs[0].id, message, sendResponse);            }        });    } else if (message.from === 'content') {          chrome.runtime.sendMessage(message);    }    return true; });
 类似资料:
  • 有时需要让扩展中的多个页面之间,或者不同扩展的多个页面之间相互传输数据,以获得彼此的状态。比如音乐播放器扩展,当用户鼠标点击popup页面中的音乐列表时,popup页面应该将用户这个指令告知后台页面,之后后台页面开始播放相应的音乐。 Chrome提供了4个有关扩展页面间相互通信的接口,分别是runtime.sendMessage、runtime.onMessage、runtime.connect和

  • 页面浏览分为两部分: 时间/页面筛选 和 页面浏览详情 1.时间/页面筛选 1)便捷按钮有今日、昨日、前日、上周 X、近七天 2)能自定义选择时间段,同时能搜索出个别字眼的页面来得出想要的结果报表 2.页面浏览详情 1)页面浏览,是指被浏览的网页,点击表头可以按相应的项目排序 2)如有需要,亦可点击下载当前报表及更多数据下载,将报表下载到个人电脑,以供存档及分析 3)点击 [细] 可查看访

  • 问题内容: 通过将Chrome 62与Chrome驱动程序2.33和WebDriver 3.6.0结合使用,Chrome允许页面使用错误的SSL证书加载- 当页面打开时,URL栏中会显示“不安全”,但页面仍然加载。如果我手动访问该页面,则会得到预期的“阻止程序页面”。 但是,我希望Chrome浏览器通过WebDriver拒绝该页面,就像Chrome对人类用户一样。 不幸的是,我找不到其他人报告同样

  • 扩展说明 对等网络节点组网器。 扩展接口 org.apache.dubbo.container.page.PageHandler 扩展配置 <dubbo:protocol page="xxx,yyy" /> <!-- 缺省值设置,当<dubbo:protocol>没有配置page属性时,使用此配置 --> <dubbo:provider page="xxx,yyy" /> 已知扩展 org.ap

  • 问题内容: 亲爱的所有人,我尝试过CSS位置:固定属性,但是它在Firefox和IE(适用于IE6的hack)上可以正常工作,但对于Chrome则根本不起作用。我以为Chrome是最新的,将非常容易地支持它,但事实并非如此。我尝试了, 再次在IE和Firefox中运行,但在Chrome中出现了问题。请任何人对此有替代解决方案。 问题答案: 这是我使用的代码。注意我将html和正文高度都设置为100

  • 本文向大家介绍通过伪协议解决父页面与iframe页面通信的问题,包括了通过伪协议解决父页面与iframe页面通信的问题的使用技巧和注意事项,需要的朋友参考一下 我们经常会有父页面与iframe页面的操作,比如 <iframe id = "iframe"></iframe> 这个iframe里面的内容是js写的。如以下代码 以上代码在大多数情况下是对的。但有种情况,即父页面显式的写了document