запуск события хранения окна в одном окне в IE - PullRequest
0 голосов
/ 22 января 2019

У меня есть следующий виджет додзё:

define("myWidgets/TimeoutAlert", [
"dojo/_base/declare",
"dojo/dom-style",
"dojo/request",
"dijit/ConfirmDialog",
"dijit/_WidgetBase"
], function(declare, domStyle, request, ConfirmDialog,
        _WidgetBase) {

return declare([_WidgetBase], {

    extendTimeout: function() {
        var self = this;
        var xhrArgs = {
                url: "rest/data/myEndPoint",
                headers: {
                    "Content-Type": "application/json; charset=utf-8"
                },
                handleAs: "json"
            };
        request.get(xhrArgs.url, xhrArgs).then(
                function () {
                    console.log("Extended Timeout. Restart Check.");
                    self.checkForTimeout();
                    // broadcast the same to other windows
                    localStorage.setItem("myBroadcast", "extendTimeout");
                });
    },

    showTimeoutWarning: function() {
        var self = this;
        var myDialog = new ConfirmDialog({
            title: 'Warning',
            content: 'This is a warning. Press OK now!',
            closable: false
        });
        domStyle.set(myDialog.cancelButton.domNode, "display", "none");

        // register events
        myDialog.on("execute", function() {
            self.extendTimeout();
        });

        // show warning
        myDialog.show();
    },

    checkForTimeout: function () {
        var self = this;
        setTimeout(function() {
                self.showTimeoutWarning();
        }, 10 * 1000);
    },

    receiveMessage: function(ev) {
        var self = this;
        if(ev.key === "myBroadcast") {
            var data = ev.newValue;
            if (data === "extendTimeout") {
                console.log('Extending session on other window now!');
                window.SessionTimeoutAlert.extendTimeout();
            }
        }
        localStorage.removeItem("myBroadcast");
    },

    startCheckingTimeout: function () {
        var self = this;
        localStorage.removeItem("myBroadcast");
        window.addEventListener("storage", self.receiveMessage);
        window.TimeoutAlert = self;
        this.checkForTimeout();
    }
});
});

Все, что он делает, это показывает ConfirmDialog после истечения времени ожидания 10 секунд. И когда пользователь нажимает OK на ConfirmDialog, выполняется вызов покоя, и тот же цикл timeout -> ConfirmDialog -> press OK -> rest call продолжает повторяться.

Теперь предположим, что виджет работает параллельно на двух окнах / вкладках, и ConfirmDialog появляется на обоих окнах одновременно.

Я пытаюсь использовать localStorage и window storage event listener, чтобы сообщить о нажатии OK в одном окне всем другим окнам.

Это прекрасно работает в Chrome и Firefox.

Однако в IE снова запускается extendTimeout даже для того окна, которое:

localStorage.setItem("myBroadcast", "extendTimeout");

Это приводит к тому, что вызов покоя выполняется дважды, поэтому всплывающие окна продолжают возводиться в квадрат в каждом цикле.

Почему это происходит?

Что я могу сделать, чтобы остановить это?

Почему receiveMessage вызывается для окна, в котором хранятся данные в localStorage?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...