Javascript 如何将数据从网页传输到firefox扩展

Javascript 如何将数据从网页传输到firefox扩展,javascript,firefox-addon,Javascript,Firefox Addon,我正在开发Firefox扩展。 我在扩展中向网页中注入了一些js。这些js将执行并将数据传输到扩展。 例如,我注射 function example(srcElement, action) { var event = document.createEvent('Events'); event.initEvent('example', true, true); var o = {}; o.actionName = action; srcElement.setUser

我正在开发Firefox扩展。
我在扩展中向网页中注入了一些js。这些js将执行并将数据传输到扩展。

例如,我注射

function example(srcElement, action) {
   var event = document.createEvent('Events'); 
   event.initEvent('example', true, true);
   var o = {};
   o.actionName = action;
   srcElement.setUserData('exampleData', o, null);
   srcElement.dispatchEvent(event); 
}
同时,我在文档中添加了一个扩展端监听器。
然后,如果执行函数示例,将调用扩展侦听器并获取数据和src元素。

问题是:现在setUserData已被弃用,并且没有传输数据和元素的方法。
setUserData的替换是

Element.dataset
此API只能传输字符串

然后我试着

window.postMessage
此API可以传输数组和对象,但不能传输元素

那么如何同时传输元素和数据呢?

您可以使用,它可以在
.detail
成员中携带自定义数据

例如,在分机中,您将:

someWindowOrElement.addEventListener("custom-event-id", function(e) {
  console.log("got event for ", e.originalTarget, "with data", e.detail);
});
在网站上:

var event = new CustomEvent("custom-event-id", {
  "bubbles": true,
  "detail": {
    "some": "data",
    "number": 1
  }
});
elem.dispatchEvent(event);
或(向后兼容FX<11)

例如,
PDF.js
使用它在非特权查看器(网站)和特权扩展部件之间进行通信

var event = document.createEvent(
  "custom-event-id",
  true, // bubbles
  false, // cancelable
  {
    "some": "data",
    "number": 1
  } // detail
});
elem.dispatchEvent(event);