Office js 当从清单命令(IE11/Edge)调用window.addEventListener时,它在Word加载项中不工作
我正在开发一个Word插件,并使用“ExecuteFunction”触发本地存储更新。然后,我在窗口对象上有一个侦听器,侦听本地存储更改 触发该功能并更新本地存储器。但是,Windows上Word的桌面版本不会触发事件侦听器 在功能文件(即清单中的“功能文件”)中,代码为:Office js 当从清单命令(IE11/Edge)调用window.addEventListener时,它在Word加载项中不工作,office-js,Office Js,我正在开发一个Word插件,并使用“ExecuteFunction”触发本地存储更新。然后,我在窗口对象上有一个侦听器,侦听本地存储更改 触发该功能并更新本地存储器。但是,Windows上Word的桌面版本不会触发事件侦听器 在功能文件(即清单中的“功能文件”)中,代码为: (() => { Office.initialize = () => { window['logout'] = (event: Office.AddinCommands.Event) =&
(() => {
Office.initialize = () => {
window['logout'] = (event: Office.AddinCommands.Event) => {
const localStorageKey = 'local-storage-key';
let localStorageData = localStorage.getItem(localStorageKey);
if (localStorageData) {
localStorageData = JSON.parse(localStorageData);
localStorageData['isLoggedOut'] = true;
localStorage.setItem(localStorageKey , JSON.stringify(localStorageData));
}
event.completed();
};
};
})();
window.addEventListener('load', () => {
window.addEventListener('storage', () => {
try {
const localStorageKey = 'local-storage-key';
const localStorageState = localStorage.getItem(localStorageKey);
// perform some action on local storage update
} catch (error) {
console.log(error);
}
});
});
然后在应用程序的入口点中,代码为:
(() => {
Office.initialize = () => {
window['logout'] = (event: Office.AddinCommands.Event) => {
const localStorageKey = 'local-storage-key';
let localStorageData = localStorage.getItem(localStorageKey);
if (localStorageData) {
localStorageData = JSON.parse(localStorageData);
localStorageData['isLoggedOut'] = true;
localStorage.setItem(localStorageKey , JSON.stringify(localStorageData));
}
event.completed();
};
};
})();
window.addEventListener('load', () => {
window.addEventListener('storage', () => {
try {
const localStorageKey = 'local-storage-key';
const localStorageState = localStorage.getItem(localStorageKey);
// perform some action on local storage update
} catch (error) {
console.log(error);
}
});
});
该代码适用于Word Online以及Word的Mac版本。它在Windows桌面版Word中不起作用-执行注销
功能,但从不触发存储
事件侦听器
我怀疑窗口事件监听器在IE11/Edge中工作不正常-例如,应用程序的iframe可能无法拾取由函数文件的iframe触发的事件,或者类似的事件
是否有替代/更好的方法来传达清单文件中的函数执行的命令和应用程序
谢谢
摩根我今天在IE11上遇到了类似的问题。我的解决方法是使用setInterval(function(){…},1000)在选项卡1中进行轮询,以检测在选项卡2中生成的localStorage.setItem(…)。在没有预期的localStorage.getItem(…)的每个不成功迭代之后,在{…}内创建一个localStorage.clear()。最后,记住在成功迭代时调用clearInterval(…)。例如: 在表1中:
let ua = window.navigator.userAgent;
if (ua.indexOf("MSIE ") != -1 || ua.indexOf('Trident/') != -1 || ua.indexOf('Edge/') != -1) {
let interval = setInterval(function() {
checkStorage({ key: "your-local-storage-item-key-set-in-tab-2" }, interval);
localStorage.clear();
}, 1000);
} else {
window.addEventListener("storage", checkStorage);
}
// ...
function checkStorage(event, interval = null) {
if (event.key == "your-local-storage-item-key-set-in-tab-2") {
// ...
let value = localStorage.getItem("your-local-storage-item-key-set-in-tab-2");
// ...
if (value) { // or... value == "expected-value"
// ...
if (interval) clearInterval(interval);
}
}
}
在表2中:
// ...
localStorage.setItem("your-local-storage-item-key-set-in-tab-2", "any-value");
// ...
我想你的诊断可能是正确的。函数文件在任务窗格中的浏览器JavaScript引擎的一个完全不同的实例中运行,因此它们具有不同的窗口对象。我认为您的任务窗格必须定期轮询LocalStorage以查看其是否已更改。谢谢@RickKirkham。显然,这是IE11和Edge中的一个问题。本地存储更新无法跨不同的选项卡/iFrame工作。我想知道微软团队是否有解决办法。从我的观点来看,我唯一能告诉你的是,一旦基于铬的edge在所有windows版本中标准化了。然后将触发localstorage事件。让我们期待chromium edge作为所有PC的soonHi@Cadu的默认浏览器-谢谢你的回答。我想试试,因为我们还没有解决这个问题。如何从tab1检测tab2的本地存储中的更改?如果您能够提供一些示例代码,那将非常好,但无论如何,这听起来很有希望。