Javascript 无法从CRM 2011中的HTML web资源中访问Xrm.Page.data
我正在尝试从HTML web资源中访问Xrm.Page.data对象,该资源已插入CRM 2011中的表单中。但是,根据我尝试访问Xrm实体的方式,我发现它未定义或Xrm.Page.data为null。web资源的代码如下所示:Javascript 无法从CRM 2011中的HTML web资源中访问Xrm.Page.data,javascript,html,dynamics-crm-2011,Javascript,Html,Dynamics Crm 2011,我正在尝试从HTML web资源中访问Xrm.Page.data对象,该资源已插入CRM 2011中的表单中。但是,根据我尝试访问Xrm实体的方式,我发现它未定义或Xrm.Page.data为null。web资源的代码如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htm
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script type="text/javascript">
function OpenMyApp(e){
alert('Xrm defined: ' + (typeof Xrm != 'undefined'));
// The line above returns the string 'Xrm defined: false'
alert('window.top.opener.parent.Xrm defined: ' + (typeof window.top.opener.parent.Xrm != 'undefined'));
// The line above returns the string 'window.top.opener.parent.Xrm defined: true'
alert('frames[0].Xrm defined: ' + (typeof frames[0].Xrm != 'undefined'));
// the line above will actually throw an error and stop the script, because the frames collection is empty.
alert(window.top.opener.parent.Xrm.Page.data);
// the line above returns null.
// var myId = Xrm.Page.data.entity.attributes.get("new_field_i_want").getValue();
// The line above is what I would like to see work.
e.preventDefault();
}
</script>
</head>
<body>
<a onClick="OpenMyApp(event);" href="#">My Link</a>
</body>
</html>
函数OpenMyApp(e){
警报('Xrm已定义:'+(Xrm的类型!='undefined');
//上面的行返回字符串“Xrm defined:false”
警报('window.top.opener.parent.Xrm defined:'+(typeof window.top.opener.parent.Xrm!='undefined');
//上面的行返回字符串“window.top.opener.parent.Xrm defined:true”
警报('frames[0].Xrm defined:'+(frames[0].Xrm!=“undefined”);
//上面的一行实际上会抛出一个错误并停止脚本,因为frames集合是空的。
警报(window.top.opener.parent.Xrm.Page.data);
//上面的行返回null。
//var myId=Xrm.Page.data.entity.attributes.get(“new_field_i_want”).getValue();
//上面这一行是我希望看到的工作。
e、 预防默认值();
}
我已经从JavaScript函数中成功访问了Xrm.Page.data,该函数是在表单事件(例如form.Load)触发的库的一部分。当它嵌入表单上的HTML web资源时,我遇到了这个问题。谁能解释一下我做错了什么,以及是否真的有一种方法可以以我希望的方式访问Xrm.Page.data
多谢各位 尝试使用以下语法访问Xrm:
window.parent.Xrm.Page.getAttribute()...
window.parent.Xrm.Page.getControl()...
window.parent.Xrm.Page.context...
像
来自示例代码。这适用于在iframe/对话框中加载web资源的情况。它可以访问父帧,然后查找所有可用帧,并检查哪个帧具有 Xrm.Page.data!=空的 代码
$.each(parent.window.frames, function(i,val){
if (parent.window.frames[i].Xrm.Page.data != null) {
parent.window.frames[i].Xrm.Page.data.entity.attributes.get('ownerid').setValue([{ id: '{' + sourceKey + '}', name: name, entityType: "systemuser" }]);
parent.window.frames[i].Xrm.Page.data.entity.save();
break;
}
});
根据TWilly的回答,我创建了下面的函数来检索
Xrm
对象
GetXrm: function () {
var frame = $.grep(parent.window.frames, function (e) {
if (e.Xrm.Page.data)
return true;
});
return frame[0].Xrm;
}
在此之前设置Xrm,如下所示:
var Xrm = parent.Xrm;
var Url = Xrm.Page.data.entity.attributes.getByName("attributename").getValue();
我也有同样的问题。我在Chrome37上运行这个。我有一个webresource显示在实体表单的IFrame中。我已经尝试了所有的组合,但仍然无法获得Xrm对象。谢谢你的帮助!您可以执行
var Xrm=window.parent.Xrm
因此每个Xrm
调用都不需要在window.parent
前面加前缀@塔哈·艾哈迈德,如果未定义Xrm,请尝试帧[0]。Xrm
或帧[1]。Xrm
。因此,您可以执行var Xrm.Page.data=Xrm.Page.data | | frames[0]。Xrm.Page.data | | | frames[1]。Xrm.Page.data | | window.parent.Xrm.Page.data代码>。类似于我关于识别脏字段的讨论。
var Xrm = parent.Xrm;
var Url = Xrm.Page.data.entity.attributes.getByName("attributename").getValue();