javascript - 窗口消息事件有时触发不止一次

标签 javascript message

我的页面中有一个 IFrame。我正在使用 postmessage 在父页面和子页面的脚本之间建立通信。我还有一个 polar 来反射(reflect) Iframe 在所有使用 cookie 的选项卡中最小化和最大化状态。

但问题是我有一个计数器,当我的子页面发送带有特殊对象的消息时,它实际上会增加。但是消息事件在父页面中触发了不止一次。如果它触发不止一次,计数器就会出错。这种情况不会一直发生。有时它工作得很好,有时却不行。跟极地有关系吗?因为当我对此发表评论时,一切正常。

这里是监听器

function listenIframe() {
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
    var eventer = window[eventMethod];       

    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

    // Listen to message from child IFrame window
    eventer(messageEvent, function (e) {
        if (e.data == xyz) {
            close();
        } else if (e.data == abcd) {
           //increase Count;
        }
    }, false);
}

这是轮询器

function fn(start) {
    var x, y, z;

    if (start) {
        j.k= setTimeout(function stateChangePollar() {
            // show or hide logic here

            setTimeout(stateChangePollar, 1000);
        }, 1000);
    }
    else {
        clearTimeout(j.k);
    }
}

最佳答案

这可能是因为多次调用了 addEventListener,很可能是在循环中或在不同的文件中。

事实上,每次调用 addEventListener 方法时,都会有一个新的处理函数附加到事件堆栈,并在事件触发时执行。

假设您对 window 对象的 resize 事件感兴趣:

function resizeHandler(e) {
   console.log("Window is resized");
}

window.addEventListener("resize", resizeHandler);
window.addEventListener("resize", resizeHandler);

如果现在调整窗口大小,在控制台中您将拥有:

Window is resized
Window is resized

因此,乍一看似乎事件被调用了多次,而事实是事件只被调用了一次,但多个处理程序正在监听该事件。

您可以通过确保在您的代码中为该特定事件只有一个 addEventListener 来解决此问题。

关于javascript - 窗口消息事件有时触发不止一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356076/

相关文章:

c# - 如何跟踪软件打开的所有文件?

windows - Delphi - 在 TPanel 中锁定子控件,但使用默认绘制

当客户端连接突然丢失时,xmpp 消息丢失

javascript - 将多个 javascript 文件合并为一个文件的工具...

javascript - 如何使用 Javascript 加载 XML 文件内容?

javascript - 如何使用外部javascript延迟图像显示

javascript - ReactJS + react 路由器 : How to disable link from React-Router's <Link>?

javascript - 无法更改 span 标签内的内容

Django 测试 - 检查重定向 View 的消息

email - 如何在 mutt 中移动多条消息