修复由office.js删除的history.pushState的最佳实践是什么?

时间:2019-10-23 13:22:41

标签: ms-office office-js html5-history history.js docusaurus

我们的团队希望建立一个可在浏览器和Excel加载项中打开的文档网站。 我们选择Docusaurus V2作为构建文档网站的主要框架,并将office.js嵌入其中。

Office.js加载后将删除history.pushStatehistory.replaceState API, 所以我添加了一些JS代码来进行polyfill,如下所示:

<html>
  <head>
    ... ...
    <script type="text/javascript">
      if (history) {
        var pushStateRef = history.pushState;
        var replaceStateRef = history.replaceState;
      }
      function patch() {
        if (history && !history.pushState) {
          history.pushState = pushStateRef;
          history.replaceState = replaceStateRef;
        }
      }
      function onOfficejsLoad() {
        Office.onReady(function() {
          console.log('office.js is ready.');
          patch();
        });
      }
    </script>
    <script
      type="text/javascript"
      src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"
      onload="onOfficejsLoad();"
    ></script>
  </head>
</html>

上面的代码使网站可以在我们的Chrome,Safari和 IE 11 的Excel Online加载项中正常运行。但是,它在 Excel for Windows 中无法正常运行:当我们单击以触发一个路由器事件时,例如点击docusaurus的侧边栏,出现错误,路由器没有效果,并且侧边栏不能正常工作(请参见Screenshot)。

我设法通过添加history.js的加载来解决此错误:

<html>
  <head>
    ... ...
    <script
      type="text/javascript"
      src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"
      onload="onOfficejsLoad();"
    ></script>
    <script
      nomodule
      type="text/javascript"
      src="https://cdnjs.cloudflare.com/ajax/libs/html5-history-api/4.2.10/history.js"
    ></script>
  </head>
</html>

我仍然发布问题,因为我不明白为什么以前的版本在Excel Online IE 11的外接程序中能正常工作,但在Excel for Windows中却行不通,它们的行为不一样吗?最重要的是,在开发Excel加载项时,是否有任何最佳实践可用于管理history.pushState和office.js的限制?

1 个答案:

答案 0 :(得分:0)

  

我添加了一些JS代码来进行填充

我认为您所做的就是我也会做的。我认为Office.js删除/覆盖历史记录方法不正确,但也许他们有充分的理由这样做(例如,只允许刷新整个页面)。

  

但是,它在Excel for Windows中无法正常运行

您知道Excel for Windows使用什么浏览器吗?可能是一个完全不同的浏览器,它不符合不同环境中的标准/运行(例如,window对象上未提供所有HTML5 API)。这就是为什么会有奇怪的行为。

抱歉,我没有Windows机器来调试此问题。