为什么我无法使用sendMessage将函数发送到内容脚本

时间:2014-05-08 06:18:36

标签: javascript google-chrome google-chrome-extension

我将以下消息发送到内容脚本:

chrome.tabs.sendMessage(activeTabId, {
    name:'executePageScript', 
    word:word, 
    isFirst:isFirst, 
    jq: function() {}
});

在内容脚本中听取它:

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {})

问题是message对象包含除jq之外的所有键,其中包含对函数表达式的引用。如果我将函数表达式更改为数字或字符串文字,例如jq:3jq:"string",则jq对象中可以使用message键。所以我似乎无法向内容脚本发送函数表达式(指向函数的指针)。这是真的吗?或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

chrome.tabs.sendMessage与JSON对象一样处理消息。 (它在传递之前序列化数据)

JSON规范不包含函数,即在JSON序列化之前将过滤所有函数。

简单的例子:

var obj = {
  a: '1',
  b: 2,
  c: undefined,
  d: null,
  e: new Date(),
  f: function(){}
}
var str = JSON.stringify(obj);

更新(解决方法):

chrome.tabs.sendMessage(activeTabId, {
    name:'executePageScript', 
    word:word, 
    isFirst:isFirst, 
    jq: 'actionName1',
    jqParams: [1,2,3]
});

其他地方:

runtimeRouter = {
  actionName1: function(a,b,c){
    console.log(arguments);
  }
}
runtime.onMessage(function(message, sender){
  if (message.jq && typeof runtimeRouter[message.jq] === 'function') {
    runtimeRouter[message.jq].apply(/*some context or null*/null, message.jqParams || []);
  }
});