当 webapp 作为 Outlook 加载项加载时有条件地加载 Office.js

Conditionally load Office.js when webapp is loaded as Outlook Add-in

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

根据关于该主题的现有问题(在此处找到:)office-js-helpers 通过使用

提供此类信息
OfficeHelpers.Utilities.host

这个 returns 要么是 "outlook" 要么是未定义的,这取决于上下文,这正是我正在寻找的(注意你首先加载 office.js 然后另一个到检查是否确实需要 office.js 的脚本)。不幸的是,我必须支持旧版本的 Outlook,即使在 outlook 中加载时,上述解决方案 returns 仍未定义(比最新版本晚 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()(如此处所示:https://docs.microsoft.com/en-us/office/dev/add-ins/develop/understanding-the-javascript-api-for-office)检查 Office.js 是否已完全加载,但我想要的是在 [= 之前​​检查29=] 被加载,无论它是否真的需要(当应用程序 运行s 在 Outlook 环境之外时它不是)。

有人 运行 遇到过类似的情况并可能分享他的见解吗?

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

例如,清单 URL 看起来像:

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

这种方法的一个好处是,如果您愿意,可以完全跳过加载 Office.js。

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

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

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