You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Manifest V3 Chrome扩展:contentScript向popup传对象失败求助

Chrome Manifest V3中Content Script向Popup传对象返回undefined的解决办法

核心问题

Chrome的消息传递机制要求传递的数据必须是JSON可序列化的,虽然普通对象理论上支持传递,但如果对象包含不可序列化的内容(比如DOM元素引用、函数、Symbol),或者代码执行过程中出现未捕获的错误,都会导致响应丢失,最终popup端收到undefined。

解决方案

1. 显式序列化对象为JSON字符串

这是最稳妥的方式,直接规避序列化兼容性问题:

修改contentScript.js:

chrome.runtime.onMessage.addListener((message, sender, response) => {
    if (message.from === "popup.js" && message.type === "RETRIEVE") {
        // 用字面量创建对象更简洁,同时添加容错处理
        const info = {
            url: "www.website.com",
            // 可选链+默认值避免DOM查询失败报错
            title: document.head.querySelector('[property="og:title"]')?.content || ""
        };
        console.log(info);
        // 序列化为JSON字符串传递
        response(JSON.stringify(info));
    }
    return true;
});

修改popup.js:

(async () => {
    const [tab] = await chrome.tabs.query({ active: true, lastFocusedWindow: true });
    const response = await chrome.tabs.sendMessage(tab.id, {
        from: "popup.js",
        type: "RETRIEVE"
    });

    // 解析JSON字符串为对象
    const data = JSON.parse(response);
    document.getElementById("result").innerText = data.url;
    console.log(data);
})();

2. 排查Content Script的执行错误

打开目标页面的开发者工具,切换到你的扩展对应的Content Script上下文(Sources面板→下拉菜单选择扩展ID),检查控制台是否有报错:

  • 比如当页面不存在og:title标签时,document.head.querySelector(...)会返回null,直接访问.content会抛出错误,导致response从未被调用,popup自然收不到数据。上面的代码用?.和默认值解决了这个问题。

3. 验证消息匹配逻辑

确保popup发送的from和type字段与content script中的判断完全一致,避免因条件不匹配导致response未执行。


内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:32:51