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(){...}

如果你不喜欢这两种解决方案,你必须设置一个全局变量,它看起来几乎没有什么不同或比上面的要好得多。全局可以是一个简单的布尔值,用于检查事件是否已附加,也可以是您自己更新的附加事件列表。AFAIK,我很确定,没有本地 JS 解决方案来获取事件监听器列表已附加到特定事件。jQuery 等库维护列表并让您阅读它们;并且可能有其他技术可以优雅地解决您的一般问题。

于 2012-09-27T21:22:59.537 回答