Javascript 是否可以在桌面outlook js加载项上使用会话存储?
TL;博士 我使用sessionStorage在加载项的不同部分之间进行通信,在“编写”窗口中按功能区按钮时执行的代码,以及打开的对话框。这在浏览器中有效,但在桌面outlook会话中,对话框中的存储空间为空。有什么好处 //TL;博士 我构建了一个js插件,它在web浏览器中运行良好,但在桌面上却坏得可怕。我更愿意在桌面上完全禁用它,因为有一个VSTO插件,它的功能甚至比js api所能做的还要多,但由于我还没有找到这样做的方法,我现在唯一的选择似乎是:让js版本在全球范围内工作 我发现桌面运行的是所有“浏览器”中的IE,我已经在outlook.com上使用IE调试了加载项,但是我已经没有语法错误了,我现在面临的问题只在桌面outlook上出现 基本思想是:当用户启动此操作时,我希望在sessionStorage中创建一个对象,除非它存在。然后,该对话框将读取该对象并向用户提供一个表单。提交后,该对象将被更新,设置将被应用,对话框将关闭。 由于某些原因,在desktop outlook上,当对话框启动时,该键的会话存储为空,而在浏览器中(即使使用IE),它已正确初始化 我曾尝试使用F12Chooser打开开发人员控制台,但由于它是在我要调试的代码已经运行之后才开始播放的,所以我不知道在执行对话框时如何捕捉对话框 代码时间: 对话框按钮在清单中定义为Javascript 是否可以在桌面outlook js加载项上使用会话存储?,javascript,office-js,outlook-web-addins,office-web-app,Javascript,Office Js,Outlook Web Addins,Office Web App,TL;博士 我使用sessionStorage在加载项的不同部分之间进行通信,在“编写”窗口中按功能区按钮时执行的代码,以及打开的对话框。这在浏览器中有效,但在桌面outlook会话中,对话框中的存储空间为空。有什么好处 //TL;博士 我构建了一个js插件,它在web浏览器中运行良好,但在桌面上却坏得可怕。我更愿意在桌面上完全禁用它,因为有一个VSTO插件,它的功能甚至比js api所能做的还要多,但由于我还没有找到这样做的方法,我现在唯一的选择似乎是:让js版本在全球范围内工作 我发现桌面运
<ExtensionPoint xsi:type="MessageComposeCommandSurface">
...
<Action xsi:type="ExecuteFunction">
<FunctionName>showMessageDialog</FunctionName>
</Action>
此时,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的角度来看,功能区按钮和打开的对话框似乎是在不同的会话中运行的,那么我应该如何解决这个问题呢?我不确定它是否100%适用于您的情况:但我过去在“加载”问题上使用的一个调试技巧是:
调试器代码本身中的code>关键字(请注意,加载外接程序时,由于未附加调试器,因此最初不会生效;但一旦附加调试器,调试器;
关键字将充当自动断点)
window.location.reload()
,然后按enter键:~Michael因为会话存储是唯一满足自动清除、最新和可在加载项功能之间共享要求的存储位置;这是我所知道的唯一可行的选择 但是,在桌面outlook上,会话不会在所有部分之间共享,因为outlook用于运行js加载项的IE在执行每个加载项函数后都会关闭会话,从而清除会话存储 我相信我也找到了相关的文档——:
“如果加载项没有在Office Online中运行,那么DisplayInFrame将被忽略。”
这使得桌面outlook在一个单独的窗口中打开我的对话框,因此
“重要信息!对话框位于一个具有自己执行上下文的新窗口中……类似地,对话框窗口具有自己的会话存储,无法从任务窗格中的代码访问它。”
因此,在我找到更好的插件间通信方法之前,我不得不求助于很长一段时间以来最丑陋的黑客之一:
Office.onReady(function(){
addinLocalStorage = new addinStorage('localStorage');
try { addinLocalStorage.setItem('_useSessionStorage', Office.context.mailbox.diagnostics.hostName != 'Outlook');
} catch (e) {}
if (addinLocalStorage.getItem('_useSessionStorage')) {
addinSessionStorage = new addinStorage('sessionStorage');
} else {
addinSessionStorage = new addinStorage('localStorage', 'ss_');
}
...
});
基本上,功能区按钮可以访问Office.context.mailbox
,因此可以将平台设置为本地存储。对话框没有访问权限,顺便说一句,这就是我被迫使用存储进行通信的全部原因,它可以读取本地存储,并根据它决定是否可以使用会话存储
现在剩下的就是找出哪些对象可以从本地存储中删除,哪些应该保留,这样数据就不会永远留在磁盘上
哦,还有对线程标题中问题的简短回答:否您试图通过会话存储API实现的场景是什么?这可以通过使用API来解决吗?@OutlookAdd insTeam MSFT也许,如果我正确阅读了重要的免责声明,我可能可以,但是这与仅仅使用本地存储有什么不同,除了它永远存储在云中,而不是永远存储在本地之外。至少使用localStorage,我可以立即获得更新和
Office.onReady(function(){
addinLocalStorage = new addinStorage('localStorage');
try { addinLocalStorage.setItem('_useSessionStorage', Office.context.mailbox.diagnostics.hostName != 'Outlook');
} catch (e) {}
if (addinLocalStorage.getItem('_useSessionStorage')) {
addinSessionStorage = new addinStorage('sessionStorage');
} else {
addinSessionStorage = new addinStorage('localStorage', 'ss_');
}
...
});