1

Firefox 拡張機能を開発しています。
そして、拡張機能でいくつかの js を Web ページに挿入しました。これらの 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

メンバー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これを使用して、非特権ビューアー (Web サイト) と特権拡張部分の間で通信します。

于 2013-11-14T12:08:51.940 に答える