我正在使用Office.context.ui.displayDialogAsync
打开一个对话框。在身份验证和一些重定向之后,对话框最终会重定向到一个负责回调父级的简单页面。
以下是页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Loading...</title>
<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script>
<script type="text/javascript">
document.write(1);
Office.initialize = function () {
document.write(2);
Office.context.ui.messageParent('Hello World!');
document.write(3);
};
document.write(5);
</script>
</head>
<body>
Loading...
</body>
</html>
有时会调用Office.initialize
并打印所有5个document.write
语句,但有时候只会随机打印1个&{打印出5个。这意味着Office.initialize
未被调用。
这是office.js中的错误还是我做错了什么?
更新:我在Office Online上尝试了相同的代码。它适用于Firefox&amp;铬。但是,在Safari上,行为与Outlook桌面相同。由于MacOS上的Outlook桌面使用Safari,这可能与Office.js与Safari的兼容性有关吗?
Update2:我使用的是VanillaJS,它可以完美运行:
以下是代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Loading...</title>
<script type="text/javascript">
window.onload = function() {
window.opener.postMessage("Hello World!"), window.location.origin);
};
</script>
</head>
<body>
Loading...
</body>
</html>
在父窗口中,我使用:
window.addEventListener("message", function(event){
if(event.origin !== window.origin) return;
console.log(event.data);
}, false);
答案 0 :(得分:1)
Office.initialize是加载项准备好与应用程序和托管文档交互时的事件。因此,代码段中的序列应该是:1,5,2,3。如果后两个数字随机丢失,则可能是office.js中的错误。 IE / Edge等浏览器的行为怎么样?这些数字也随机丢失吗?
答案 1 :(得分:0)
虽然在您的简单复制品中似乎并非如此,但总的来说 - 今天的Office.initialize
存在两个问题:
setTimeout
中使用3秒后,使用人为的示例),它就不会触发。Office.initialize
(您不能拥有多个{1}},因为您直接设置了该对象。好消息是这很快就会改变!我们即将发布一个API来替换(或者更确切地说,追加,但意图是让一个取代另一个)Office.initialize
以解决这两个问题。 “Office.onReady”API,可以按如下方式使用:
Office.onReady(function() {
console.log("Office is now ready 1!");
});
Office.onReady(function() {
console.log("Office is now ready 2!");
});
// And both should fire, after the host is ready
或作为承诺:
Office.onReady()
.then(function() {
console.log("Office is now ready 1!");
});
Office.onReady()
.then(function() {
console.log("Office is now ready 2!");
});
甚至使用TypeScript的async / await:
(async () => {
await Office.onReady();
console.log("Office is now ready!");
})();
使用Office.onReady,你可以在哪里调用它。如果您在主机准备好之前调用它,我们将等待启动它,直到主机 准备就绪。或者,如果你稍后再打电话,我们就会立刻开火 - 就像jQuery的$(document).ready
一样。
如果您想尝试一下,可以参考https://unpkg.com/@microsoft/office-js@1.1.7-release-next.0/dist/office.js中的构建版本,看看此API是否适合您。 (Unpkg是一种虚拟CDN服务,不隶属于Microsoft - 但它确实提供了一种简单的测试方法,并且经常在Web社区的其他地方使用)。如果它有效,那么好消息是API应该很快就会在CDN上(几周之后)。如果没有,那么我们必须深入挖掘。
很想获得您的使用和输入。
谢谢!