在我的 Outlook WebAddin 中,我尝试使用以下代码注册邮件 ItemChange 事件。
Office.context.mailbox.addHandlerAsync(Office.EventType.ItemChanged, mailItemSelectionChanged, [], function (result) {
if(result && result.status != 'succeeded'){
console.error('result => ' + result);
}
});
每当用户在固定模式下更改邮件时,我都会第一次收到邮件更改事件。然后,如果对话发生变化,我将重新加载插件位置.reload()清除缓存并加载新鲜的插件。
重新加载插件后,无法注册 mailItemChange 事件并抛出以下错误:
{“code”:5001,“message”:“发生内部错误。”,“name”:
“内部错误”}
它在浏览器和某些 Windows 计算机中失败(在许多其他情况下工作)。
展望诊断 :
{“主机”:“Outlook”,“平台”:“OfficeOnline”,“版本”:
“16.0.9215.1000”}
我可以找出与 Office.EventType.ItemChanged 事件注册相关的以下行为:
- 您不能注册多个事件处理程序。大多数人在第二次尝试注册事件处理程序时都会遇到错误,这样第一个事件处理程序就不会被取消注册。
- 事件处理程序的注册寿命超出了加载项网页的寿命。这意味着当您的加载项卸载当前网页并重新加载相同或不同的网页(即导航到另一个网页)时,事件处理程序的注册仍将保留。
- 取消注册事件处理程序时,您不仅必须提供处理程序函数的名称,还要确保该函数与您用于注册事件的函数完全相同。换句话说,如果您在重新加载网页后尝试取消注册事件处理程序,则处理程序函数的对象不相同,因此事件处理程序不会被取消注册。
- 当 Outlook 关闭加载项窗格时,事件处理程序注册会丢失。
因此,在您的情况下,您需要在调用 location.reload() 之前取消注册事件,如下所示。
Office.context.mailbox.removeHandlerAsync(Office.EventType.ItemChanged, {handler: mailItemSelectionChanged}, function(result) {
if (result.status === Office.AsyncResultStatus.Failed) {
console.log('Item Change event could not be unregistered.');
console.log(result.error);
}
else {
console.log('Item Change event unregistered successfully.');
}
});
setTimeout(function() {location.reload();}, 100);
如果想要从加载项导航到相同或另一个网页,他们可以将单击事件处理程序附加到锚标记(或按钮),以确保在卸载当前页面之前已取消注册 ItemChanged 事件处理程序。我使用以下代码完成了此操作:
$(document).ready(function() {
$('.NavBarContainer a').toArray().forEach(function(anchor1, index) {
$(anchor1).click(function(event) {
if(itemChangeEventRegistered) {
unregisterItemChangeHandler();
setTimeout(function() {window.location = anchor1.href;}, 100);
return false;
}
return true;
});
});
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)