javascript - 通过 chrome.runtime.sendMessage 发送带有函数的对象

标签 javascript google-chrome

我正在开发一个 chrome 扩展,我想用 chrome.runtime.sendMessage 发送一个对象(具有一些功能)。

现在做这样的事情

chrome.runtime.sendMessage({something: "Funny"}); 

工作正常。但是一旦我想创建更复杂的东西,我的消息似乎就是一个空对象。

function FunnyFunction() {
    return 42;
}
var exampleObject = new Object();
exampleObject.FunnyFunction = FunnyFunction;

chrome.runtime.sendMessage({something: exampleObject });

现在在接收端它成功地注册了一条消息并且还检测到它有一个键“something”。 但是 exampleObject 总是空的。里面没有函数。

chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse) {
        console.log("got message: ");
        console.log(request);
        if ('something' in request) {
            exampleObject = request.exampleObject;
            console.log(exampleObject);
        }
    }
);

请求总是一个对象

Object {something: Object}

但是“something”后面的对象,应该是 exampleObject——我之前用 2 个函数定义的对象——总是空的。

Object {}

当我尝试执行 exampleObject.FunnyFunction();它显然崩溃了,因为它没有这样的成员。

我在这里做错了什么?

最佳答案

您不能通过消息传递 API 传递函数,因为它使用序列化的 JSON 作为数据交换格式,不支持将函数作为基本类型。理想情况下,您应该已经在需要它的上下文(即背景/事件页面、弹出页面等)中拥有可用的功能,但是在您需要将功能从扩展的一部分传递到另一部分的情况下,您需要使用 JSON.stringify 将函数序列化为 JSON 字符串,并在另一端使用 JSON.parse 将 JSON 字符串反序列化为原始函数,然后您可以利用它。

关于javascript - 通过 chrome.runtime.sendMessage 发送带有函数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32814553/

相关文章:

javascript - 尝试更改对象属性内的数组值

Javascript:分几步显示文本

javascript - 如何延迟 gif 从页面加载开始?

html - 在 Safari 和 Chrome 中格式化

javascript - 如何检测用户在 Javascript 中输入表情符号、特殊/外来字符和其他输入 - 没有 keyup 事件?

shell - 以编程方式加载解压的 Chrome 扩展

javascript - 尝试使用 SoundManager 2 在循环中实现交叉淡入淡出

google-chrome - 是否可以在单独的窗口中打开 chrome 调试器?如何?

google-chrome - 网络应用程序 : Failures: Service worker does not successfully serve the manifest's start_url

javascript - WordPress jQuery 将值发送到数据库