当Web应用程序作为Outlook加载项加载时,有条件地加载Office.js



我目前正在构建一个web应用程序,该应用程序既可以在浏览器中作为独立版本加载,也可以作为Outlook加载项加载。为了利用Outlook环境,我正在web应用程序的布局中加载office.js。我想检查web应用程序是在Outlook中加载(作为加载项(还是在浏览器中作为web应用程序加载,这样我就可以有条件地隐藏需要应用程序在Outlook中运行的功能。

根据该主题上存在的问题(可在此处找到:检查Office.js是否在Office客户端之外加载(,Office.js助手通过使用提供此类信息

OfficeHelpers.Utilities.host

根据上下文的不同,它会返回"outlook"或undefined,这正是我想要的(需要注意的是,您首先加载office.js,然后再加载另一个脚本来检查是否真的需要office.js(。不幸的是,我不得不支持旧版本的Outlook,即使在Outlook中加载,上面的解决方案也会返回未定义的结果(比最新版本晚了2年-看不到任何变化(。

有趣的是,office.js本身(或者更确切地说是它的一个依赖项,o15apptofilemappingtable.js,https://appsforoffice.microsoft.com/lib/1.1/hosted/o15apptofilemappingtable.js)在缩小后的JavaScript中已经有一行代码,可以确定office.js是在Outlook环境之外加载的,并打印警告:

if(d._hostInfo.isRichClient){var e,a,u="Warning: Office.js is loaded outside of Office client",

同样,这正是我想要的,但我似乎无法理解如何自己实现这样的检查。我知道您可以通过使用Office.onReady((来检查Office.js是否已完全加载(如下所示:https://learn.microsoft.com/en-us/office/dev/add-ins/develop/understanding-the-javascript-api-for-office),但我想要的是在加载office.js之前检查它是否真的有必要(当应用程序在Outlook环境之外运行时,这不是必需的(。

有没有人遇到过类似的情况,可能会分享他的见解?

需要考虑的一个简单选项是在清单中向外接程序的URL添加查询参数。然后,当该查询参数丢失时,您就知道该应用程序直接在web浏览器中运行。此方法还可以用于区分清单中加载同一页面的多个URL。

例如,清单URL看起来像:

<SourceLocation DefaultValue="https://.../taskpane.html?host=Outlook" />

这种方法的一个好处是,如果你选择的话,你可以完全跳过加载Office.js。

另一种方法是在Office.js加载后调用API。在您的示例的基础上,有一个类似的Outlook API,名为Office.context.mailbox.diagnostics.hostName,它在旧版本的Outlook中可用(API的需求集版本为1.0,这是最低版本(。

但实际上,当不在Outlook中运行时,Office.js不会加载Outlook API,Office.context.mailbox就是undefined。因此,在javascript中,您只需要检查是否定义了Office.context.mailbox

正如问题中所指出的,调用任何Office API都需要等待Office.initializeOffice.onReady()被调用,因此它不是最佳性能的首选选项。

最新更新