由于访问被拒绝精神错乱,我无法使用onload
函数中的JavaScript向远程服务器发出请求。因此,为了使CRM服从,我设置了一个 IFRAME 并将其连接到运行我的JavaScript的HTML页面。现在,只要我在脚本中获得一些值(在 IFRAME 中运行),我如何将它们传递给保持父项中的方法?
不太确定如何更详细地解释它,所以请随时询问。
答案 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属性检查消息发送者的身份。这不容低估:未检查源和可能的源属性会导致跨站点脚本攻击。
答案 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服务器,至少在为在线版本开发解决方案时没有。