1

私は現在、iframe を開き、前後の postMessage の通信を設定するブックマークレットに取り組んでいます。それはすべてうまくいきます。ただし、ブックマークレットが匿名関数として読み込まれているためと思われるため、ページでブックマークレットを複数回実行すると、リスナーが増加します。

これらの addEventListeners を追跡して二重にならないようにする方法はありますか?

無名関数の外で rp_receive_message を定義する必要がありますか?

コードの例を次に示します。

var rp_receive_message = function (e) {
    var response = e.data;
    console.log("got message with "+ response);
  };

if (window.addEventListener) {
  window.addEventListener('message', rp_receive_message, false);
} else {
  window.attachEvent('onmessage', rp_receive_message);
}

var s1 = window.document.createElement('iframe');

s1.setAttribute('src', 'http://mydomain.com/iframe.html');
s1.setAttribute('id', 'testiframe');
s1.setAttribute('width', '700');
s1.setAttribute('height', '550');
s1.setAttribute('frameBorder', '0');
s1.setAttribute('onload', 'this.contentWindow.postMessage(window.location.href, "http://mydomain.com/iframe.html");');


document.getElementById('container').appendChild(s1);
4

1 に答える 1

0

おそらくこれで問題は解決します:

window.onmessage = rp_receive_message;

あなたが示唆するように、以下のコードはそれだけで十分かもしれません。addEventListener と attachEvent が同じ関数を複数回追加するかどうかはわかりませんが、追加されてもまったく驚かないでしょう。私はそれをテストすることをお勧めします。

window.rp_receive_message = function(){...}

どちらのソリューションも気に入らない場合は、グローバル変数を設定する必要があります。これは、上記とほとんど変わらないか、はるかに優れているように見えます。グローバルは、イベントが添付されているかどうかを確認する単純なブール値にすることも、自分で更新する添付イベントのリストにすることもできます。私の知る限り、特定のイベントにアタッチされているイベント リスナーのリストを取得するためのネイティブ JS ソリューションはありません。jQuery などのライブラリはリストを維持し、それらを読み取ることができます。また、一般的な問題に対するエレガントな解決策である他の手法がある可能性があります。

于 2012-09-27T21:22:59.537 に答える