0

是否可以在浏览器扩展中的背景和内容脚本之间传输对象?

我希望我的后台脚本来处理我的浏览器内存储。我的内容脚本应该跟踪用户交互并存储它们。因此,如果我的“抽象”存储引擎从后台脚本中获取,我计划使用单例模式来获取实例,以避免在用户记录交互并同时通过浏览器扩展的 UI 管理他的数据时出现同步问题。

我的第一次尝试是这样的:

后台脚本

var StorageEngine, _StorageEngine;

StorageEngine = (function() {
  var _instance;
  function StorageEngine() {}
  _instance = null;
  StorageEngine.getInstance = function() {
    return _instance != null ? _instance : _instance = new _StorageEngine;
  };
  return StorageEngine;
})();

_StorageEngine = (function() {
  function _StorageEngine() {}
  _StorageEngine.prototype.sayMyName = function(message) {
    return 'hello ' + message;
  };
  return _StorageEngine;
})();

内容脚本

(function() {
  kango.invokeAsync('StorageEngine.getInstance', function(val) {
    var asd;
    if (val) {
      debugger;
    }
    asd = val.sayMyName('Alice');
    return kango.console.log(asd);
  });
}).call(this);

val不是未定义的,如果 google 调试器是可信赖的,但函数未定义,则它是一个对象sayMyName

4

2 回答 2

1

由于浏览器的限制,您不能将函数从后台传递到内容脚本,您只能传递 JSON 可序列化数据。

尝试以这种方式使用存储:

// background script
var storage = StorageEngine.getInstance();

// content script
kango.invokeAsync('storage.sayMyName', 'Alice', function(val) {
    kango.console.log(val);
});
于 2013-01-19T04:45:40.807 回答
1

Chrome 扩展内容脚本存在于 中isolated worlds,这意味着它们共享 DOM,但具有单独的 JavaScript沙箱

因此,您的kango.invokeAsync函数和所有变量都无法访问content script. 如果您想使用页面 JS 变量和函数,请在此处定义内容脚本。

var script = document.createElement('script'); // Create a Script Tag
script.src = chrome.extension.getURL("yourscript.js"); //Fetch the content script
script.onload = function () {
    this.parentNode.removeChild(this); //Remove script after script executed
};
(document.head || document.documentElement).appendChild(script); //ADD script tag 
                                                       //to head or Html element

您的代码在内容脚本和后台页面之间没有任何通信机制。为您的所有功能需求添加消息通信系统。

参考:

于 2013-01-04T17:30:42.803 回答