Google Chrome 插件开发: 无法建立连接, 接收端不存在. Could not establish connection. Receiving end does not exist

本文介绍了一个关于Chrome浏览器扩展程序中消息传递失败的问题及其解决方案。当尝试从背景脚本向内容脚本发送消息时,若目标页面未正确注入content-script,则会遇到连接失败的错误。文章解释了这一现象产生的原因,并提供了确保content-script正确注入的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过以下代码向当前页面发送 “start” 消息:

chrome.tabs.query({active: true,currentWindow: true}, tabs => {
    let tab = tabs[0];
    chrome.tabs.sendMessage(tab.id, "start");
});

报错:

Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist.

可能的原因:

接收端, 也就是说目标页面必须有 chrome.runtime.onMessage 监听消息, 如果 “content-script” 没有注入到页面中, 那么这个页面就无法接收消息

如果你的插件刚刚加载, 并且在一个已经加载完毕的页面中使用它, 则会出这个问题.

因为这个页面已经加载完了, 它并没有被注入脚本, 你需要刷新页面, 使脚本注入到页面中, 然后才可以发送消息

平台不允许文章内容太少, 下面是水

sendMessage
chrome.tabs.sendMessage(integer tabId, any message, function responseCallback)
向指定标签页中的内容脚本发送一个消息,当发回响应时执行一个可选的回调函数。当前扩展程序在指定标签页中的每一个内容脚本都会收到 runtime.onMessage 事件。

参数类型
tabIdinteger
messageany
responseCallbackoptional function

如果您指定了 responseCallback 参数,它应该指定一个如下形式的函数:

function(any response) {…};
response ( any )
请求处理程序发出的 JSON 响应对象。如果连接到指定标签页的过程中发生错误,将不传递参数调用回调函数,并将 runtime.lastError 设置为错误消息。

<think>嗯,用户遇到了“Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.”这个错误,需要解决。首先,我要回忆一下相关的引用内容。根据引用[1]、[2]、[3]、[4],可能的原因有几个方面。 首先,引用[2]提到,如果在加载扩展后没有刷新页面直接使用插件,就会出现这个错误。解决办法是刷新页面。这可能是因为插件需要在页面加载时注入内容脚本,如果没有刷新,内容脚本未运行,导致接收端存在。所以,第一步应该建议用户刷新页面,尤其是在安装或更新插件后。 接着,引用[3]指出某个特定插件(如Video Speed Controller)可能导致这个问题,建议关闭插件排查。用户可能需要逐一禁用插件,找出有问题的那个。这时候,可能需要指导用户如何进入Chrome的扩展管理页面,逐个禁用并测试。 然后,引用[4]提到在Chrome插件开发中,发送消息时如果接收端存在,可能是因为内容脚本未正确注入或标签页未准备好。开发者需要检查内容脚本是否已注入,或者使用chrome.tabs.onUpdated事件等待标签页加载完成后再发送消息。这可能涉及到代码逻辑的问题,比如在发送消息前没有确认内容脚本是否已经注入。 另外,引用[1]提到即使在新项目中也会出现此错误,说明可能与浏览器状态或缓存有关。可能需要清除浏览器缓存或重启浏览器,甚至检查代码是否有逻辑错误,比如没有正确处理异步操作。 综合这些信息,解决方法应该分步骤,从简单的刷新页面开始,逐步排除插件冲突,最后检查代码逻辑。对于开发者来说,可能需要确保内容脚本正确注入,并处理标签页加载状态。同时,普通用户可能需要关闭有问题的插件。需要将解决方案分点列出,结构清晰,方便用户逐步操作。</think>### 分步解决方案 #### 问题分析 错误信息 `Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist` 通常出现在浏览器扩展开发或使用场景中,表明消息发送方无法找到接收方(如内容脚本未正确注入或已关闭)[^1][^2][^4]。 #### 解决步骤 1. **刷新当前页面** 若为普通用户,安装或更新插件后未刷新页面时可能触发此错误。直接刷新页面(快捷键 `F5` 或 `Ctrl+R`)即可解决[^2]。 2. **排查冲突的浏览器插件** - 打开 Chrome 浏览器,输入地址栏:`chrome://extensions` - 逐个**禁用扩展**(关闭右侧开关),每禁用一个后刷新页面测试 - 若禁用某插件后错误消失,说明是该插件导致(如 `Video Speed Controller` 等常见冲突插件)[^3]。 3. **开发者代码逻辑检查(针对扩展开发者)** - **确认内容脚本已注入**: 在 `manifest.json` 中检查 `content_scripts` 是否正确定义目标页面和脚本: ```json "content_scripts": [{ "matches": ["<all_urls>"], "js": ["content-script.js"] }] ``` - **延迟消息发送**: 在发送消息前,通过 `chrome.tabs.onUpdated` 监听标签页状态,确保页面加载完成后再发送: ```javascript chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { if (changeInfo.status === 'complete') { chrome.tabs.sendMessage(tabId, { action: "start" }); } }); ``` - **添加错误处理**: 使用 `try/catch` 或 `Promise.catch()` 捕获错误: ```javascript chrome.tabs.sendMessage(tabId, "start", response => { if (chrome.runtime.lastError) { console.warn("接收端未就绪:", chrome.runtime.lastError); } }); ``` 4. **清除浏览器缓存或重启浏览器** 若错误持续存在,可能是浏览器状态异常。尝试清除缓存或完全重启浏览器。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值