1

onload由于访问被拒绝疯狂,我无法在函数中使用 JavaScript 向远程服务器发出请求。因此,为了让 CRM 服从,我设置了一个IFRAME并将其连接到运行我的 JavaScript 的 HTML 页面。现在,假设我在脚本中获得了一些值(在IFRAME中运行),我如何将它们传达给持有父级的方法?

不太清楚如何更详细地解释它,所以请随时询问。

4

3 回答 3

2

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>

任何窗口都可以在任何其他窗口上访问此方法,无论文档在窗口中的位置如何,都可以随时向其发送消息。因此,任何用于接收消息的事件侦听器都必须首先使用源属性和可能的​​源属性检查消息发送者的身份。这一点不容小觑:未能检查来源和可能的来源属性会导致跨站点脚本攻击。

来源:https ://developer.mozilla.org/en/DOM/window.postMessage

于 2013-01-16T03:30:08.850 回答
2

访问被拒绝是同源策略。您将在 IFRAME 中遇到同样的问题,除非您提供页面或只是来自您随后尝试向其发出 AJAX 请求的同一服务器的脚本 src。

假设您正在执行后者,那么您只需要确保您已取消选中您添加到 CRM 表单的 IFRAME 上的“限制跨框架脚本”选项。现在,您可以从 IFRAME 访问您在父 CRM 表单的全局范围内通过window.parent.yourfunctionNameHere(xyz).

于 2012-11-26T22:38:55.107 回答
1

最近,我很高兴能连接到 Web 服务并检索一些数据。实现这一点后,我发现自己坐在上述数据上并不完全知道该放在哪里。

长话短说,我使用了以下源代码。

parent.window.Xrm.Page.data.entity.attributes
  .get("new_Konrad").setValue("Viltersten");

值得注意的是,为了与父表单进行通信,HTML 文件(我的 JavaScript 所在的位置)需要作为 Web 资源放置在 CRM 结构中。换句话说,仅仅通过指向一个外部的“<em>http://some.where/some.thing”,我们可以消费一项服务,但不能将获得的信息传送到 CRM 服务器,至少不能在为在线版本开发解决方案时。

于 2013-01-20T21:21:27.267 回答