TL;博士
我使用 sessionStorage 在插件的不同部分之间进行通信,在撰写窗口中按下功能区按钮时执行的代码,以及它打开的对话框。这在浏览器中有效,但在桌面 Outlook 对话框中的 sessionStorage 为空。是什么赋予了?
//TL;博士
我已经构建了一个 js 插件,它在 web 上的浏览器中运行良好,但在桌面上却严重损坏。我宁愿在桌面上完全禁用它,因为有一个 VSTO 插件比 js api 甚至能够做的更多,但由于我还没有找到这样做的方法,我现在唯一的选择似乎是: js 版本在全球范围内工作。
我发现桌面正在运行所有“浏览器”的 IE,并且我已经在 outlook.com 上使用 IE 调试插件,但是我已经用完了语法错误,我现在面临一个问题本身在桌面前景。
基本思想是:当用户启动此操作时,我想在 sessionStorage 中创建一个对象,除非它存在。然后对话框将读取对象并向用户呈现一个表单,提交后该对象被更新,设置被应用并且对话框关闭。出于某种原因,在桌面前景中,当对话框启动时,该键的 sessionStorage 为空,而在浏览器中(即使使用 IE)它已正确初始化。
我尝试使用 F12Chooser 打开开发控制台,但由于它是在我要调试的代码已经运行后开始播放的,所以我不知道在执行对话框时我能做些什么来捕捉对话框。
代码时间:
对话框按钮在清单中定义为
<ExtensionPoint xsi:type="MessageComposeCommandSurface">
...
<Action xsi:type="ExecuteFunction">
<FunctionName>showMessageDialog</FunctionName>
</Action>
运行:
function showMessageDialog(event) {
addinLogic.initializeMessage().done(function(messageItem) {
addinSessionStorage.setItem('CurrentAccount', Office.context.mailbox.userProfile.emailAddress);
addinSessionStorage.setItem(addinLogic.CurrentMessageItems, messageItem);
$.when(openDialogAsIframe('/dialogfile.html')).always(function(){ event.completed(); });
});
}
function openDialogAsIframe(dialogPage) {
var def = $.Deferred();
Office.context.ui.displayDialogAsync(
window.location.protocol + '//' + window.location.host + dialogPage,
{ height: 50, width: 75, displayInIframe: true }, dialogCallback.bind(def));
return def.promise();
}
此时 sessionStorage 应该包含该对象,但是,当对话框启动时,它返回告诉我 messageItem 对象不存在。
(function () {
var _messageItem = null;
...
Office.onReady( function addinLevelsControllerInit(reason) {
app.initialize();
$(function () {
...
_messageItem = addinSessionStorage.getItem(addinLogic.CurrentMessageItems);
if (!_messageItem) {
Office.context.ui.messageParent('messageItem isnt there!');
return;
}
addinSessionStorage.getItem
基本上可以window.sessionStorage || window.opener.sessionStorage || parent.window.opener.sessionStorage
到目前为止,获取任何信息的唯一方法是打开 F12 窗口以获取其他信息并告诉它在出现任何异常时停止,这给了我类似 IE6 级别的错误消息,而无法更深入地调查错误状态。煞费苦心地我已经能够将问题缩小到这里,现在我能想到的进一步调试的最佳方法是猜测工作并通过ui.messageParent
. 如果只有一种方法可以将 console.log 重定向到文件..
--
编辑:所以即使我没有找到任何好的调试途径,我也已经到达了某个地方。如果我将此对象写入 localStorage,则插件可以正常工作,但是由于正在处理敏感数据,因此不能将其永久保留在磁盘上。
那么我应该如何解决这个问题,因为从 Outlook/IE 的角度来看,功能区按钮和打开的对话框似乎在单独的会话中运行?