У меня есть следующий виджет додзё:
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
?