Office js 当从清单命令(IE11/Edge)调用window.addEventListener时,它在Word加载项中不工作

Office js 当从清单命令(IE11/Edge)调用window.addEventListener时,它在Word加载项中不工作,office-js,Office Js,我正在开发一个Word插件,并使用“ExecuteFunction”触发本地存储更新。然后,我在窗口对象上有一个侦听器,侦听本地存储更改 触发该功能并更新本地存储器。但是,Windows上Word的桌面版本不会触发事件侦听器 在功能文件(即清单中的“功能文件”)中,代码为: (() => { Office.initialize = () => { window['logout'] = (event: Office.AddinCommands.Event) =&

我正在开发一个Word插件,并使用“ExecuteFunction”触发本地存储更新。然后,我在窗口对象上有一个侦听器,侦听本地存储更改

触发该功能并更新本地存储器。但是,Windows上Word的桌面版本不会触发事件侦听器

在功能文件(即清单中的“功能文件”)中,代码为:

(() => {
    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的本地存储中的更改?如果您能够提供一些示例代码,那将非常好,但无论如何,这听起来很有希望。