onload
由于访问被拒绝疯狂,我无法在函数中使用 JavaScript 向远程服务器发出请求。因此,为了让 CRM 服从,我设置了一个IFRAME并将其连接到运行我的 JavaScript 的 HTML 页面。现在,假设我在脚本中获得了一些值(在IFRAME中运行),我如何将它们传达给持有父级的方法?
不太清楚如何更详细地解释它,所以请随时询问。
onload
由于访问被拒绝疯狂,我无法在函数中使用 JavaScript 向远程服务器发出请求。因此,为了让 CRM 服从,我设置了一个IFRAME并将其连接到运行我的 JavaScript 的 HTML 页面。现在,假设我在脚本中获得了一些值(在IFRAME中运行),我如何将它们传达给持有父级的方法?
不太清楚如何更详细地解释它,所以请随时询问。
postMessage 听起来可能合适。
window.postMessage
,当被调用时,当必须执行的任何挂起脚本完成时(例如,如果从事件处理程序调用 window.postMessage 时剩余的事件处理程序、先前设置的挂起超时等),会导致在目标窗口调度 MessageEvent。MessageEvent 具有消息类型,数据属性设置为提供给 window.postMessage 的第一个参数的字符串值,原始属性对应于在时间窗口调用 window.postMessage 的窗口中的主文档的来源。 postMessage 被调用,源属性是调用 window.postMessage 的窗口。
要使用 window.postMessage,必须附加一个事件监听器:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
并且receiveMessage
必须声明一个函数:
function receiveMessage(event) {
// do something with event.data;
}
异地 iframe 还必须通过 postMessage 正确发送事件:
<script>window.parent.postMessage('foo','*')</script>
任何窗口都可以在任何其他窗口上访问此方法,无论文档在窗口中的位置如何,都可以随时向其发送消息。因此,任何用于接收消息的事件侦听器都必须首先使用源属性和可能的源属性检查消息发送者的身份。这一点不容小觑:未能检查来源和可能的来源属性会导致跨站点脚本攻击。
访问被拒绝是同源策略。您将在 IFRAME 中遇到同样的问题,除非您提供页面或只是来自您随后尝试向其发出 AJAX 请求的同一服务器的脚本 src。
假设您正在执行后者,那么您只需要确保您已取消选中您添加到 CRM 表单的 IFRAME 上的“限制跨框架脚本”选项。现在,您可以从 IFRAME 访问您在父 CRM 表单的全局范围内通过window.parent.yourfunctionNameHere(xyz)
.
最近,我很高兴能连接到 Web 服务并检索一些数据。实现这一点后,我发现自己坐在上述数据上并不完全知道该放在哪里。
长话短说,我使用了以下源代码。
parent.window.Xrm.Page.data.entity.attributes
.get("new_Konrad").setValue("Viltersten");
值得注意的是,为了与父表单进行通信,HTML 文件(我的 JavaScript 所在的位置)需要作为 Web 资源放置在 CRM 结构中。换句话说,仅仅通过指向一个外部的“<em>http://some.where/some.thing”,我们可以消费一项服务,但不能将获得的信息传送到 CRM 服务器,至少不能在为在线版本开发解决方案时。