1

我正在开发一个 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); 
}

同时,我在文档中添加了一个扩展端的监听器。
然后,如果函数示例执行,将调用扩展侦听器并获取数据和 srcElement。

问题是:现在不推荐使用 setUserData 并且没有方法来传输数据和元素。
setUserData 的替换是

Element.dataset

此 API 只能传输字符串。

然后我尝试了

window.postMessage

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

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

4

1 回答 1

2

您可以使用 a CustomEvent,它可以在成员中携带自定义数据.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)

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

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

于 2013-11-14T12:08:51.940 回答