Office JS Dialog API在Word 16.13(Mac)无法再次打开弹窗问题
解决Mac Word 16.13中displayDialogAsync错误12007的问题
首先,这个错误代码12007提示“任务窗格已打开一个对话框”但实际没有,且仅在特定Mac版本复现,大概率是该版本Mac Office的对话框状态管理bug——Office内部没有正确清理已关闭对话框的状态,导致认为仍有对话框处于打开状态。结合你的代码和环境,我们可以从以下几个方向排查和修复:
1. 修复代码中错误分支的潜在问题
你的代码在asyncResult.status === "failed"时直接调用dialog.close(),但此时asyncResult.value(也就是dialog)可能还未被正确初始化,直接调用close()会抛出未定义错误,这可能进一步干扰Office的对话框状态管理。先修改这部分逻辑:
Office.context.ui.displayDialogAsync( dialogUrl, { width: 60, height: 60, requireHTTPS: false, displayInIframe: false }, asyncResult => { dialog = asyncResult.value; if (asyncResult.status === "failed") { dispatch(MessageActions.showError(asyncResult.error.message)); // 先判断dialog是否存在再调用close if (dialog) { dialog.close(); } // 手动重置dialog实例 dialog = null; } else { dialog.addEventHandler(Office.EventType.DialogMessageReceived, arg => { dispatch({ type: LOADED }); dialog.close(); dialog = null; // 关闭后重置实例 }); dialog.addEventHandler(Office.EventType.DialogEventReceived, arg => { if (arg && arg.error === 12006) { dispatch({ type: LOADED }); } // 无论是否错误,都重置dialog实例 dialog = null; }); } });
关闭对话框后手动将dialog置为null,确保代码层面没有残留的实例引用,也能帮助Office正确识别状态。
2. 针对Mac特定版本的临时规避方案
由于这是旧版本Mac Office的bug,我们可以在调用displayDialogAsync前,先尝试清理可能存在的残留对话框状态:
- 尝试强制关闭现有(可能是Office内部认为存在的)对话框:如果
dialog变量不为null,先调用close()再重置。 - 切换对话框的显示模式:将
displayInIframe设置为true,Mac上iframe模式的对话框实现逻辑和原生模式不同,可能绕过这个状态管理bug。
修改后的调用代码示例:
// 调用前先清理可能的残留对话框 if (dialog) { try { dialog.close(); } catch (e) { // 忽略关闭失败的情况 } dialog = null; } // 切换为iframe模式尝试 Office.context.ui.displayDialogAsync( dialogUrl, { width: 60, height: 60, requireHTTPS: false, displayInIframe: true }, asyncResult => { // 后续逻辑同修改后的代码... });
3. 版本升级建议
这个问题仅出现在Word for Mac v16.13(18.05.13),后续微软已经修复了对话框状态管理的相关bug,建议用户升级到最新版本的Office for Mac,从根源上解决这个问题。
内容的提问来源于stack exchange,提问作者RatiboR
相关产品推荐
相关产品推荐

