Javascript Dynamics CRM 365-无法访问HTML web资源中的Xrm.Page.entity
我在我的联系人表单中添加了一个html资源,它只包含一个小图像,以便将其放置在联系人字段旁边。当用户单击它时,它会启动一个javascript函数,我想在其中获取表单特定字段的值。该字段是联系人实体的属性。 以下是HTML web资源:Javascript Dynamics CRM 365-无法访问HTML web资源中的Xrm.Page.entity,javascript,html,dynamics-crm,dynamics-crm-365,Javascript,Html,Dynamics Crm,Dynamics Crm 365,我在我的联系人表单中添加了一个html资源,它只包含一个小图像,以便将其放置在联系人字段旁边。当用户单击它时,它会启动一个javascript函数,我想在其中获取表单特定字段的值。该字段是联系人实体的属性。 以下是HTML web资源: <html> <head> <style type="text/css"> body { margin: 0; padding: 0;
<html>
<head>
<style type="text/css">
body
{
margin: 0;
padding: 0;
}
</style>
<script type="text/javascript">
function call() {
var phoneNumber = window.parent.Xrm.Page.getAttribute("mobilephone").getValue();
}
</script>
<meta>
</head>
<body style="word-wrap: break-word;">
<img onmouseover="this.style.cursor='pointer';" src="/webresources/new_/image/image.png" onclick="call()">
</body>
</html>
但它也不起作用:无法读取null的实体
问题是getAttribute返回null,不管我想要获取的实体的字段是什么。它总是未定义的
有人有主意吗
使用web资源编程时,请使用GetGlobalContext函数
获取上下文信息。要获取GetGlobalContext
函数,包括对
ClientGlobalContext.js.aspx
在包含引用时,可以使用GetGlobalContext函数
指向位于web根目录下的ClientGlobalContext.js.aspx页面
资源目录
还有几点建议: 尝试从
window.parent.Xrm.Page
中删除window
添加到表单的HTML web资源不能使用定义的全局对象
通过在表单中加载的JavaScript库HTML web资源可能会
通过以下方式与表单中的Xrm.Page或Xrm.Utility对象交互
使用parent.Xrm.Page或parent.Xrm.Utility,但使用全局对象
无法使用父级访问由表单脚本定义的。你
应在中加载HTML web资源需要的任何库
HTML web资源,因此它们不依赖于
形式
尝试从表单脚本传递输入
对于网页(HTML)web资源,请使用setSrc方法操作
querystring参数直接输入
在HTML页面中,可以使用
JavaScript中的window.location.search属性
如果您无法服用詹姆斯·伍德的绝妙解决方案,请尝试: 1。您必须检查您的项目是否在iframe中 您可以从以下脚本中获得灵感:
Xrm.Page.ui.controls.get('id_iframe').getObject().onload= function() {
var element = Xrm.Page.ui.controls.get('id_iframe').getObject().contentWindow.document.getElementById('id_element_inside_iframe');
console.log(element);
};
<HTML>
<BODY onload="SetupEvents()">
<label id="myLabel" >Click me</label>
</BODY>
<SCRIPT>
function DoTheThing() { alert('thing was done'); }
function SetupEvents() {
addEvent( document.getElementById('myLabel'),'click', function () { DoTheThing(); });
}
function addEvent(element, evnt, funct){
if (element.attachEvent)
return element.attachEvent('on'+evnt, funct);
else
return element.addEventListener(evnt, funct, false);
}
</SCRIPT>
</HTML>
Xrm.Page.ui.controls.get('id\u iframe').getObject():返回HTML对象iframe
2。您可能会遇到一个名为“问题”的事件。
您可以从以下脚本中获得灵感:
Xrm.Page.ui.controls.get('id_iframe').getObject().onload= function() {
var element = Xrm.Page.ui.controls.get('id_iframe').getObject().contentWindow.document.getElementById('id_element_inside_iframe');
console.log(element);
};
<HTML>
<BODY onload="SetupEvents()">
<label id="myLabel" >Click me</label>
</BODY>
<SCRIPT>
function DoTheThing() { alert('thing was done'); }
function SetupEvents() {
addEvent( document.getElementById('myLabel'),'click', function () { DoTheThing(); });
}
function addEvent(element, evnt, funct){
if (element.attachEvent)
return element.attachEvent('on'+evnt, funct);
else
return element.addEventListener(evnt, funct, false);
}
</SCRIPT>
</HTML>
点击我
函数DoTheThing(){alert('thing was done');}
函数SetupEvents(){
addEvent(document.getElementById('myLabel'),'click',函数(){DoTheThing();});
}
函数addEvent(元素、evnt、funct){
if(元素附件)
返回元素.attachEvent('on'+evnt,funct);
其他的
返回元素.addEventListener(evnt、funct、false);
}
我认为这是一个Turbo Forms问题,因为Turbo Forms并行加载Javascript,并将ClientGlobalContext.js.aspx作为最后一项加载。如果框架包含一个OnReadyStateCompleted事件,我建议您在该事件下添加以下代码
function call() {
var phoneNumber = window.parent.Xrm.Page.getAttribute("mobilephone").getValue();
}
见下图
假设您的Web资源位于根标签上。。。然后必须首先添加ClientGlobalContext引用
<script src="ClientGlobalContext.js.aspx" type="text/javascript"></script>
非常感谢您的回答,但我可以访问Xrm.Page,甚至可以访问Xrm.Page.Context,但不能访问显示实体的数据,例如联系人…啊,没有注意到这个细节。是的。。。你有什么想法吗?非常感谢。我目前正在尝试该解决方案:。稍后将尝试您的解决方案:)放置在表单上的HTML web资源不会放置在项目中。我刚刚创建了一个Web资源并将其放置在表单上。我在Microsoft Dynamics 2015上做了同样的事情(更具体地说是在统一服务台上),效果很好。。。但在Dynamics 365上,但在检查DOM之后,似乎已将HTML ressource添加到iFrame中。我会尝试你的解决方案。@HubertSolecki:我认为将HTML web资源放在iFrame或web资源控件中不会有什么区别。在Dynamics CRM 2016/365中,在大多数情况下,web资源的加载早于与之集成的表单。因此,在将函数附加到iFrame的onload事件之后,还需要设置它的源。@Henk van Boeijen>>“因此,在将函数附加到iFrame的onload事件之后”->,出于这个原因,我使用了Xrm.Page.ui.controls.get('id_iFrame').getObject().onload…有些不对劲,您提供的两个代码示例都可以正常工作。将调试器语句放入调用函数中,在浏览器中打开开发工具,然后单击调用。然后,在开发工具中,当您点击调试器时,检查window.parent.location。它返回的值是您期望的值吗?同时检查window.parent.Xrm.Page。它应该有一个getAttribute方法和一个数据属性。这种类型的调查可能会发现一些错误。另外,您在所有浏览器中得到的错误都是相同的吗?