有没有办法在 Office.js 中禁用初始化计时器?
Is there a way to disable the initialization timer in Office.js?
我们在较差的网络条件下测试 Office.js 加载项时遇到了问题。甚至在我们的脚本加载之前就会抛出以下错误:
Uncaught Office.js has not been fully loaded yet. Please try again later or make sure to add your initialization code on the Office.initialize function.
调试了几个小时后,我们在 Office.js
中发现了以下代码:
g.waitForFunction(function() {
return Microsoft.Office.WebExtension.initialize != undefined
}, function(a) {
if (a) {
if (h.prepareApiSurface)
Microsoft.Office.WebExtension.initialize(h.getInitializationReason(b));
else
h.prepareRightBeforeWebExtensionInitialize(b);
h.prepareRightAfterWebExtensionInitialize && h.prepareRightAfterWebExtensionInitialize()
} else
throw "Office.js has not been fully loaded yet. Please try again later or make sure to add your initialization code on the Office.initialize function."
}, 400, 50)
waitForFunction
方法有4个参数:
function
- 状态检查函数 returns 一个布尔值。
function
- 当状态检查函数 returns true
或方法失败时调用的回调函数。
Number
- 重试次数。
Number
- 尝试之间的毫秒数。
根据我们发现的源代码,Office 加载项有大约 20 秒的时间进行初始化,然后框架超时并简单地放弃。这在 Office 365 在线和慢速连接上尤其成问题。
以下加载项重现了该问题:
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<title>Test Init</title>
<script src="//appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
</head>
<body class="ms-font-l" style="width:100%;height:100%;overflow:hidden;position:relative;">
<div id="app" style="height:100%"></div>
<script>
console.log('Our script loaded...');
setTimeout(function () {
Office.initialize = function () {
console.log('Our App Initialized!!!')
};
}, 15000);
</script>
</body>
</html>
我的问题是,有没有办法绕过这个超时?或者至少增加它?也许使用类似的东西:
Office.initialize(function() { /* ... */ });
而不是:
Office.initialize = function() { /* ... */};
如果不是,办公室团队会考虑更改计时器以改为使用 属性:
Object.defineProperty(Office, 'initialize', {
get: function() { return Office._initialize; },
set: function(value) { Office._initialize = value; Office.triggerCodeDependantOnInitialize(); }
});
目前没有办法避免超时。也就是说,您应该始终在执行任何其他操作之前调用 Office.initialize 。一般来说,我的指导是将这个调用放在你的 HEAD 的底部。
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<title>Test Init</title>
<script src="//appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
<script>
Office.initialize = function () {
console.log('Office Initialized!!!')
};
</script>
</head>
然后我使用一个事件来触发文档准备就绪时我需要的任何其他初始化代码(即 document.addEventListener("DOMContentLoaded", function(event){ })
或 JQuery 的 $(document).ready
)
我们在较差的网络条件下测试 Office.js 加载项时遇到了问题。甚至在我们的脚本加载之前就会抛出以下错误:
Uncaught Office.js has not been fully loaded yet. Please try again later or make sure to add your initialization code on the Office.initialize function.
调试了几个小时后,我们在 Office.js
中发现了以下代码:
g.waitForFunction(function() {
return Microsoft.Office.WebExtension.initialize != undefined
}, function(a) {
if (a) {
if (h.prepareApiSurface)
Microsoft.Office.WebExtension.initialize(h.getInitializationReason(b));
else
h.prepareRightBeforeWebExtensionInitialize(b);
h.prepareRightAfterWebExtensionInitialize && h.prepareRightAfterWebExtensionInitialize()
} else
throw "Office.js has not been fully loaded yet. Please try again later or make sure to add your initialization code on the Office.initialize function."
}, 400, 50)
waitForFunction
方法有4个参数:
function
- 状态检查函数 returns 一个布尔值。
function
- 当状态检查函数 returns true
或方法失败时调用的回调函数。
Number
- 重试次数。
Number
- 尝试之间的毫秒数。
根据我们发现的源代码,Office 加载项有大约 20 秒的时间进行初始化,然后框架超时并简单地放弃。这在 Office 365 在线和慢速连接上尤其成问题。
以下加载项重现了该问题:
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<title>Test Init</title>
<script src="//appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
</head>
<body class="ms-font-l" style="width:100%;height:100%;overflow:hidden;position:relative;">
<div id="app" style="height:100%"></div>
<script>
console.log('Our script loaded...');
setTimeout(function () {
Office.initialize = function () {
console.log('Our App Initialized!!!')
};
}, 15000);
</script>
</body>
</html>
我的问题是,有没有办法绕过这个超时?或者至少增加它?也许使用类似的东西:
Office.initialize(function() { /* ... */ });
而不是:
Office.initialize = function() { /* ... */};
如果不是,办公室团队会考虑更改计时器以改为使用 属性:
Object.defineProperty(Office, 'initialize', {
get: function() { return Office._initialize; },
set: function(value) { Office._initialize = value; Office.triggerCodeDependantOnInitialize(); }
});
目前没有办法避免超时。也就是说,您应该始终在执行任何其他操作之前调用 Office.initialize 。一般来说,我的指导是将这个调用放在你的 HEAD 的底部。
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<title>Test Init</title>
<script src="//appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
<script>
Office.initialize = function () {
console.log('Office Initialized!!!')
};
</script>
</head>
然后我使用一个事件来触发文档准备就绪时我需要的任何其他初始化代码(即 document.addEventListener("DOMContentLoaded", function(event){ })
或 JQuery 的 $(document).ready
)