Javascript 是否可以在桌面outlook js加载项上使用会话存储?

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版本在全球范围内工作 我发现桌面运

TL;博士

我使用sessionStorage在加载项的不同部分之间进行通信,在“编写”窗口中按功能区按钮时执行的代码,以及打开的对话框。这在浏览器中有效,但在桌面outlook会话中,对话框中的存储空间为空。有什么好处

//TL;博士

我构建了一个js插件,它在web浏览器中运行良好,但在桌面上却坏得可怕。我更愿意在桌面上完全禁用它,因为有一个VSTO插件,它的功能甚至比js api所能做的还要多,但由于我还没有找到这样做的方法,我现在唯一的选择似乎是:让js版本在全球范围内工作

我发现桌面运行的是所有“浏览器”中的IE,我已经在outlook.com上使用IE调试了加载项,但是我已经没有语法错误了,我现在面临的问题只在桌面outlook上出现

基本思想是:当用户启动此操作时,我希望在sessionStorage中创建一个对象,除非它存在。然后,该对话框将读取该对象并向用户提供一个表单。提交后,该对象将被更新,设置将被应用,对话框将关闭。 由于某些原因,在desktop outlook上,当对话框启动时,该键的会话存储为空,而在浏览器中(即使使用IE),它已正确初始化

我曾尝试使用F12Chooser打开开发人员控制台,但由于它是在我要调试的代码已经运行之后才开始播放的,所以我不知道在执行对话框时如何捕捉对话框

代码时间:

对话框按钮在清单中定义为

<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%适用于您的情况:但我过去在“加载”问题上使用的一个调试技巧是:

  • 让任务窗格/对话框正常加载

  • 附加Visual Studio(例如,使用中的说明)。在代码中找到要设置断点的位置;或者使用
    调试器关键字(请注意,加载外接程序时,由于未附加调试器,因此最初不会生效;但一旦附加调试器,
    调试器;
    关键字将充当自动断点)

  • 从Visual Studio右上角的“快速启动”菜单中,启动“JavaScript控制台”

  • 在弹出的窗口中,键入
    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_');
        }
        ...
    });