在对话框中不会随机调用Office.initialize

时间:2018-04-17 07:14:47

标签: office-js outlook-web-addins

我正在使用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中的错误还是我做错了什么?

  • OS:MacOS High Sierra(10.13.4)
  • Outlook版本:16.11(180311)

更新:我在Office Online上尝试了相同的代码。它适用于Firefox&amp;铬。但是,在Safari上,行为与Outlook桌面相同。由于MacOS上的Outlook桌面使用Safari,这可能与Office.js与Safari的兼容性有关吗?

Update2:我使用的是VanillaJS,它可以完美运行:

  • Outlook桌面(MacOS)
  • Firefox上的Outlook Web
  • Chrome上的Outlook Web
  • Safari上的Outlook Web

以下是代码:

<!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);

2 个答案:

答案 0 :(得分:1)

Office.initialize是加载项准备好与应用程序和托管文档交互时的事件。因此,代码段中的序列应该是:1,5,2,3。如果后两个数字随机丢失,则可能是office.js中的错误。 IE / Edge等浏览器的行为怎么样?这些数字也随机丢失吗?

答案 1 :(得分:0)

虽然在您的简单复制品中似乎并非如此,但总的来说 - 今天的Office.initialize存在两个问题:

  1. 你称之为的地方有所不同。称之为太迟(例如,在setTimeout中使用3秒后,使用人为的示例),它就不会触发。
  2. 您只能声明一个Office.initialize(您不能拥有多个{1}},因为您直接设置了该对象。
  3. 好消息是这很快就会改变!我们即将发布一个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上(几周之后)。如果没有,那么我们必须深入挖掘。

    很想获得您的使用和输入。

    谢谢!