0

我正在创建一个将 iframe 注入页面的 Chrome 扩展程序。扩展在 3 个页面之间传递数据(特别是对象):正在访问的页面、iframe 内容和 background.html

我正在传递使用构造函数创建的对象,如下所示:

function url(href, anchorText, altText, linksOut){
    this.href = href;
    this.anchorText = anchorText;
    this.altText = altText;
    this.linksOut = linksOut;
};

在控制台中,以这种方式创建的对象将如下所示:

url {href: "http://www.foo.com", anchorText: "Foo", altText: "", linksOut: Array[42]}

我还可以在控制台中看到附加到对象的构造函数:

__proto__: url
  constructor: function url(href, anchorText, altText, linksOut){
  ...

相关部分是它具有对象/构造函数的名称。当我将访问页面中的数据传递给 background.html 时,问题就来了。在这里拉起控制台,它已经失去了它的名字,变成了一个通用的(匿名的?)对象:

Object {href: "http://www.foo.com", anchorText: "Foo", altText: "", linksOut: Array[42]}

我可以看到构造函数已经丢失:

__proto__: Object
  ...
  constructor: function Object() { [native code] }
  ...

那么问题来了,有没有办法在页面之间传递一个对象并保留与其构造函数的关联?

4

1 回答 1

0

背景页面和内容脚本之间发送的消息是 JSON 编码的对象。您的 url 对象被字符串化,然后在后台页面上解析,从而失去其“身份”。

A.)
如果您正在寻找一种将对象从内容脚本传递到后台页面的方法,那么在后台页面中对其进行修改并能够看到内容脚本中的更改,这是不可能的,因为对象是不同的。
也许,您可以通过使用chrome.runtime.onMessagesendResponse侦听器的回调来提出部分解决方法,但我怀疑这是否值得。

B.)
如果您只需要获取从内容脚本发送的 url 对象的副本,您也可以在后台页面中定义构造函数,并在收到消息时实例化一个新对象。例如:

在 background.js 中:

...
function url(href, anchorText, altText, linksOut) {
    this.href = href;
    this.anchorText = anchorText;
    this.altText = altText;
    this.linksOut = linksOut;
}
...
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
    var genericObj = msg.urlObj;
    var urlObjClone = new url(genericObj.href, genericObj.anchorText,
                              genericObj.altText, genericObj.linksOut);
});
...

(无论如何,更具体地说明您最终想要实现的目标,可能会产生更好的建议。)

于 2013-10-30T19:53:52.020 回答