Dynamics CRM 2013至2016升级:JavaScript Web资源适配问询
嘿,我之前帮不少客户搞定过CRM从2013到2016的JS适配问题,你的这个场景简直是升级中的高频痛点!先给你梳理下最可能踩的坑和对应的修复方案:
1. 别再直接操作DOM,改用官方Xrm.Page API
CRM 2016对表单的DOM结构做了大幅优化,2013里那种直接用document.getElementById()或者jQuery硬选元素的写法,大概率会失效。必须用官方提供的表单API来操作字段:
原2013可能的写法(容易挂):
var field1Val = document.getElementById("FIELD1").value;
改成2016兼容的写法:
var field1Attr = Xrm.Page.getAttribute("FIELD1"); var field1Val = field1Attr ? field1Attr.getValue() : null;
2. 字段显示/隐藏与必填设置的标准写法
你的核心需求是根据FIELD1的值控制FIELD2的可见性和必填性,这部分2016的API和2013基本一致,但要注意参数格式(别用数字参数!):
完整的逻辑代码示例:
function onLeadFormLoad() { // 获取FIELD1的属性和控件 var field1Attr = Xrm.Page.getAttribute("FIELD1"); var field2Ctrl = Xrm.Page.getControl("FIELD2"); var field2Attr = Xrm.Page.getAttribute("FIELD2"); if (!field1Attr || !field2Ctrl || !field2Attr) return; // 防止字段不存在报错 // 替换成你的特定值,比如选项集值或者文本值 var targetValue = "你的特定值"; if (field1Attr.getValue() === targetValue) { // 显示FIELD2并设为业务必填 field2Ctrl.setVisible(true); field2Attr.setRequiredLevel("required"); } else { // 隐藏FIELD2并取消必填 field2Ctrl.setVisible(false); field2Attr.setRequiredLevel("none"); } }
注意:
setRequiredLevel的参数必须是字符串:"required"(业务必填)、"none"(非必填)、"recommended"(推荐必填),如果原来的代码用了数字(比如1、0),赶紧改成字符串!
3. 表单事件绑定要规范
2016对全局作用域的管控更严格,别再直接写全局函数了,用自执行函数包裹避免命名冲突,同时确保事件绑定正确:
// 用自执行函数包裹,隔离作用域 (function() { function onLeadFormLoad() { // 上面的逻辑代码 } // 绑定表单加载事件 if (typeof Xrm !== "undefined" && Xrm.Page) { Xrm.Page.data.entity.addOnLoad(onLeadFormLoad); } })();
另外还要去表单设计器里确认:Web资源已经添加到表单,并且“加载”事件里正确调用了这个函数,同时勾选了“启用”选项。
4. 检查字段的逻辑名称!
升级过程中,有时候字段的逻辑名称会不小心被修改(尤其是显示名和逻辑名不一致的情况),而API是完全依赖逻辑名称的。你可以去CRM的解决方案里找到Lead实体的FIELD1和FIELD2,查看它们的逻辑名称,确保代码里的字符串和逻辑名称完全一致(大小写敏感!)。
5. 浏览器兼容性别忽略
CRM 2016不再支持IE8/IE9,建议用IE11、Chrome或者Firefox等现代浏览器。同时检查CRM系统设置里的“浏览器兼容性”配置,确保允许现代浏览器访问,避免因为兼容性模式导致JS执行异常。
如果还有具体的报错(比如浏览器控制台里的错误信息),可以贴出来,我帮你精准排查!
内容的提问来源于stack exchange,提问作者Kasluc Komleshi

