最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Sending Object with functions via chrome.runtime.sendMessage - Stack Overflow

programmeradmin1浏览0评论

I am developing a chrome extension where I want to send an object ( with some functions ) around with chrome.runtime.sendMessage.

Now doing things like this

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

works just fine. But as soon as I want to create something more plex my message seems to be an empty object.

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

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

Now on the receiving end it successfully registeres a message and also detects that it has a key "something". But exampleObject is always empty. No functions inside.

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);
        }
    }
);

request is always an object

Object {something: Object}

But the object behind 'something', which should be exampleObject - the object I definied earlier with 2 functions - is always just empty.

Object {}

When I try to do exampleObject.FunnyFunction(); it obviously crashes, because it has no such member.

What am I doing wrong here?

I am developing a chrome extension where I want to send an object ( with some functions ) around with chrome.runtime.sendMessage.

Now doing things like this

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

works just fine. But as soon as I want to create something more plex my message seems to be an empty object.

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

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

Now on the receiving end it successfully registeres a message and also detects that it has a key "something". But exampleObject is always empty. No functions inside.

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);
        }
    }
);

request is always an object

Object {something: Object}

But the object behind 'something', which should be exampleObject - the object I definied earlier with 2 functions - is always just empty.

Object {}

When I try to do exampleObject.FunnyFunction(); it obviously crashes, because it has no such member.

What am I doing wrong here?

Share Improve this question edited Sep 28, 2015 at 1:40 asked Sep 28, 2015 at 1:22 user2329125user2329125 4
  • Are you sure it's empty? Does an arrow show up on the side of the Object {} log, if so click on it and you should see the properties. – Patrick Evans Commented Sep 28, 2015 at 1:35
  • It is empty. No arrow. – user2329125 Commented Sep 28, 2015 at 1:36
  • sendMessage may not allow passing of functions. postMessage in the Messaging api uses the Structured clone algorithm, so maybe sendMessage does as well. Which if it does it will not duplicate functions so they wouldnt be passed along. Have you tried adding on other properties (strings, numbers, nested objects, etc) – Patrick Evans Commented Sep 28, 2015 at 1:41
  • Yes, the properties all stay, except functions. Guess I am not allowed to pass functions, although there is no bit of information about that in the documentation developer.chrome./extensions/runtime#method-sendMessage – user2329125 Commented Sep 28, 2015 at 1:45
Add a ment  | 

1 Answer 1

Reset to default 8

You can't pass functions through the Message Passing API because it uses serialized JSON as the data interchange format, which doesn't support functions as a basic type. Ideally, you would already have the function available in the context upon which you need it (i.e. background/event page, popup page, etc.) but, in a case where you need to pass a function from one part of your extension to another, you would need to use JSON.stringify to serialize the function into a JSON string and, at the other end, use JSON.parse to deserialize the JSON string back into the original function, upon which you can then utilize it.

发布评论

评论列表(0)

  1. 暂无评论