能否通过Outlook加载项按钮侧载另一加载项?现有代码加载异常如何解决
能否通过Outlook加载项侧载另一个加载项?现有方案失效如何修复?
核心问题解答
可以通过一个Outlook加载项触发加载另一个加载项,但不能直接用window.location.href跳转——Outlook加载项运行在受限制的沙箱iframe中,直接跳转会丢失Office.js的上下文环境,导致第二个加载项无法获取邮件数据或调用Office API。
现有代码的问题
你当前的代码用window.location.href跳转,虽然能打开第二个加载项的页面,但该页面无法访问Office的上下文(比如Office.context.mailbox),自然加载不了所需数据。
修复方案:使用Office.js Dialog API
正确的做法是用Office提供的Dialog API打开第二个加载项,这样能保持Office上下文,还能实现两个加载项之间的通信。
第一个加载项的修改代码
将点击事件改为调用displayDialogAsync:
const loadSecondaryAddin = async () => { try { // 配置对话框参数 const dialogOptions = { height: 500, width: 800, displayInIframe: true // 保持在iframe中,保留上下文 }; // 打开第二个加载项的URL const dialog = await Office.context.ui.displayDialogAsync("https://your-secondary-addin-url", dialogOptions); // 可选:监听第二个加载项发来的消息 dialog.addEventHandler(Office.EventType.DialogMessageReceived, (args) => { console.log("收到来自子加载项的消息:", args.message); // 这里可以处理子加载项传回的数据 }); // 监听对话框错误或关闭事件 dialog.addEventHandler(Office.EventType.DialogEventReceived, (args) => { if (args.error) { console.error("对话框出错:", args.error); } }); } catch (error) { console.error("打开子加载项失败:", error); } };
第二个加载项的初始化代码
确保第二个加载项正确初始化Office.js并获取上下文数据:
// 必须等待Office.js初始化完成 Office.initialize = () => { // 加载所需的邮件数据(比如主题、正文) Office.context.mailbox.item.loadAsync(["subject", "body"], (result) => { if (result.status === Office.AsyncResultStatus.Succeeded) { const subject = result.value.subject; const body = result.value.body; // 将数据渲染到页面上 document.getElementById("subject").textContent = subject; document.getElementById("body").innerHTML = body; } else { console.error("加载邮件数据失败:", result.error); } }); };
额外注意事项
- 两个加载项都需要通过侧载添加到Outlook的信任列表中
- 第二个加载项的URL必须在其
manifest.xml的AppDomains中配置,确保被Office允许访问 - 不要在加载项中使用
window.open或window.location.href跳转,这类操作会脱离Office沙箱,导致上下文丢失
内容的提问来源于stack exchange,提问作者Kethaki Dissanayake
相关产品推荐
相关产品推荐

