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

时间:2013-11-14 07:35:59

标签: 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.setUserData('exampleData', o, null);
   srcElement.dispatchEvent(event); 
}

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

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

Element.dataset

此API只能传输字符串。

然后我试了

window.postMessage

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

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

1 个答案:

答案 0 :(得分:2)

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

E.g。在您的扩展名中:

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使用此功能在非特权查看者(网站)和特权扩展部分之间进行通信。