在IFRAME和实体之间进行通信

时间:2012-11-26 18:45:36

标签: dynamics-crm-2011

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

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

3 个答案:

答案 0 :(得分:2)

访问被拒绝是Same Origin Policy。你将要从IFRAME遇到同样的问题,除非你正在为你正在尝试发出AJAX请求的同一服务器提供页面或脚本src。

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

答案 1 :(得分:2)

postMessage听起来很合适。

调用时,

window.postMessage会导致在任何必须执行的挂起脚本完成时在目标窗口调度MessageEvent(例如,如果从事件处理程序调用window.postMessage,则保留事件处理程序,之前设置等待超时等)。 MessageEvent具有类型消息,一个data属性,设置为提供给window.postMessage的第一个参数的字符串值,一个origin属性,对应于窗口调用window.postMessage时窗口中主文档的原点。调用了postMessage,还有一个source属性,它是调用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>

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

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

答案 2 :(得分:1)

最近,我很高兴能够连接到Web服务并检索一些数据。当达到这个目标时,我发现自己坐在上述数据上并不知道该把它放在哪里。

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

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

值得注意的是,为了与父表单进行通信,HTML文件(我的JavaScript所在的位置)需要作为Web结构中的Web资源放置。换句话说,只需指向外部“ http://some.where/some.thing ”,我们就可以使用服务,但无法将获得的信息传达给CRM服务器,至少在为在线版本开发解决方案时没有。