将消息从主机页传递到对话框的替代方法

将数据和消息从父页传递到子对话的建议方法是使用 方法, messageChild 如在 Office 外接程序中使用 Office 对话 API 中所述。如果你的外接程序在不支持 DialogApi 1.2 要求集的平台或主机上运行,则可以通过另外两种方式将信息传递给对话。

  • 将信息存储在主机窗口和对话框可访问的位置。 这两个窗口 (Window.sessionStorage 属性) 不共享公共会话存储,但如果 它们具有相同的域 (包括端口号(如果有任何) ),则它们共享一个公共 本地存储

    注意

    对浏览器安全性的更改会影响令牌处理策略。

    • 如果外接程序在 Office web 版 Microsoft Edge 旧版 (非Chromium) 或 Safari 浏览器中运行,则对话框和任务窗格不会共享相同的本地存储,因此不能用于在它们之间进行通信。
    • 从基于 Chromium 的浏览器(例如 Chrome 和 Edge)的版本 115 开始,存储分区将进行测试,以防止特定侧通道跨站点跟踪 (另请参阅 Microsoft Edge 浏览器策略) 。 这意味着,存储 API 存储的数据(例如本地存储)仅适用于具有相同源和相同顶级站点的上下文。 若要解决此问题,请在浏览器中转到 chrome://flagsedge://flags,然后将 实验性第三方存储分区 (#第三方存储分区) 标志设置为 “已禁用”。 如果可能,我们建议使用 messageParentmessageChild 方法在对话和任务窗格之间传递数据,如在 Office 外接程序中使用 Office 对话框 API 中所述。
  • 向传递给 displayDialogAsync 的 URL 添加查询参数。

使用本地存储

若要使用本地存储,请在setItem调用前displayDialogAsync在主机页中调用 对象的 方法window.localStorage,如以下示例所示。

localStorage.setItem("clientID", "15963ac5-314f-4d9b-b5a1-ccb2f1aea248");

对话框中的代码在需要时读取项,如以下示例所示。

const clientID = localStorage.getItem("clientID");
// You can also use property syntax:
// const clientID = localStorage.clientID;

使用查询参数

下面的示例展示了如何使用查询参数传递数据。

Office.context.ui.displayDialogAsync('https://myAddinDomain/myDialog.html?clientID=15963ac5-314f-4d9b-b5a1-ccb2f1aea248');

有关使用此技术的示例,请参阅Insert Excel charts using Microsoft Graph in a PowerPoint add-in(在 PowerPoint 加载项中使用 Microsoft Graph 插入 Excel 图表)。

对话框中的代码可以分析 URL,并读取参数值。

重要

Office 会自动向传递给 _host_info 的 URL 添加查询参数 displayDialogAsync。 (它追加到自定义查询参数之后(如果有)。它不会追加到对话框导航到的任何后续 URL。) Microsoft 将来可能会更改此值的内容或将其完全删除,因此代码不应读取该值。 相同的值将添加到对话框的会话存储 (Window.sessionStorage 属性) 。 同样,代码不得对此值执行读取和写入操作