无法在“DOMWindow”上执行“postMessage”:提供的目标来源(“https://outlook.office.com”)与收件人窗口的来源不匹配

Posted

技术标签:

【中文标题】无法在“DOMWindow”上执行“postMessage”:提供的目标来源(“https://outlook.office.com”)与收件人窗口的来源不匹配【英文标题】:Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://outlook.office.com') does not match the recipient window's origin 【发布时间】:2019-05-25 14:05:54 【问题描述】:

以下是工作 MS Outlook Web 插件文件的开头。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
  <title></title>
  <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" type="text/javascript"></script>

  <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script>

  <link rel="stylesheet" href="https://appsforoffice.microsoft.com/fabric/1.0/fabric.min.css" />
  <link rel="stylesheet" href="https://appsforoffice.microsoft.com/fabric/1.0/fabric.components.min.css" />

  <script src="../../Assets/Scripts/jquery.fabric.js" type="text/javascript"></script>

  <link href="../../App.css" rel="stylesheet" type="text/css" />
  <script src="../../App.js" type="text/javascript"></script>

  <script src="Demo.js" type="text/javascript"></script>
</head> 

但是,演示使用的是 JQuery,我想用现有的 AngularJs 替换它,修改为 Web 插件。

我的文件开始

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8" />  
    <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script> 
    <script src="MyDialogView.js" type="text/javascript"></script> 
  <title>MyApp</title>
</head>

并给出以下控制台错误:

在“DOMWindow”上执行“postMessage”失败: 提供的目标原点 ('https://outlook.office.com') 与收件人窗口的原点 ('https://localhost') 不匹配。

这看起来像是一个 CORS 问题。但是为什么我没有从上面的文件中得到它,它在 localhost 的同一目录中?

我不能发布整个应用程序,但我希望这能引起人们的记忆……我做错了什么?


[更新] 与一些类似的问题不同,不涉及 iframe。另外,添加&lt;AppDomain&gt;https://outlook.office.com&lt;/AppDomain&gt; 并没有帮助(但是当我从中复制的页面没有问题时,为什么要这样做?)

【问题讨论】:

查看this question问题可能与AppDomain有关。 非常感谢,Suresh。我试过了,并更新了我的问题。它没有用,我小心地清除浏览器缓存并重新加载清单:-( 如果您在 Outlook for Windows 中遇到此问题,还可以尝试另一件事。将兼容性设置为 IE=Edge,好像postMessage 存在浏览器兼容性问题 你为什么说不涉及iframe?您如何授予用户在您的应用中访问其帐户的权限? 不,只是想多了解一点。您是否手动引导您的 Angular 应用程序? 【参考方案1】:

您必须手动引导您的 AngularJs 应用程序,因为 Office.jsAngularJS 似乎无法同时使用。尝试在Office.initialize() 函数中使用angular.bootstrap() 手动初始化AngularJs。当您手动引导 AngularJs 时,请注意不要在 index.html 中使用 ng-app="myApp"

Office.initialize = function () 
   $(document).ready(function ()  // If you want jQuery too
      angular.bootstrap(document, ['myApp'])
   );

var app = angular.module('myApp', [// Other config...]);
// Your app config and code

编辑:

如果你不想要 jQuery

Office.initialize = function () 
   angular.element(document).ready(function () 
      angular.bootstrap(document, ['myApp'])
   );

甚至更多,如果您的 app.js 位于 html 底部,就在 &lt;/body&gt; 附近,您可以简单地使用 angular.bootstrap(document, ['myApp']),因为 DOM 已经加载。

【讨论】:

如果我不想要 jQuery,我只需删除 $(document).ready?如果是这样,我该如何等到页面加载完毕后再启动我的 Angular 应用程序? @Mawg 您可以使用上述选项:1)使用 jQlite 方式,如 AngularJs Doc angular.element(document).ready 和 AngularJs 等待 dom 已为您加载或 2)将您的脚本放在底部页面并仅使用angular.bootstrap(document, ['myApp']) 谢谢,Emanuele 我昨天没有时间尝试,但今天下午和整个周末都有时间。如果这行得通,预计会有超过 50 个奖励积分:-) 希望如此!谢谢 @Mawg 接受答案。如果你没有解决你的问题,我不高兴。我会尽快写一封电子邮件。我在 stackexchange 上看到了您的问题,我会尽力提供帮助。

以上是关于无法在“DOMWindow”上执行“postMessage”:提供的目标来源(“https://outlook.office.com”)与收件人窗口的来源不匹配的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Stripe 支付模块在“DOMWindow”上执行“postMessage”

Google Picker 拒绝加载错误“无法在 'DOMWindow' 上执行 'postMessage':提供的目标来源”

无法使用 Google 代码在“DOMWindow”上执行“postMessage”

无法在“DOMWindow”上执行“postMessage”:提供的目标原点与接收窗口的原点不匹配(“null”)

使用JSONP创建Blogger站点:无法在'DOMWindow'上执行'postMessage'

无法在“DOMWindow”上执行“postMessage”:提供的目标来源(“https://outlook.office.com”)与收件人窗口的来源不匹配