我们正在测试2013年至2016年Dynamics CRM的升级,以了解CRM升级后需要升级的自定义项。
我们有以下用于特定情况的Javascript网络资源。
function MyOnLoad()
{
var pickListValue = Xrm.Page.getAttribute("field1").getValue();
if (Xrm.Page.ui.getFormType() == 2 && pickListValue == 100000006)
{
var ddlNewField1 = document.getElementById("field1");
if (ddlNewField1.addEventListener) {
ddlNewField1.addEventListener ("change", function () {MyOnChange();}, false);
}
else {
ddlNewField1.attachEvent('onchange',MyOnChange);
}
}
}
function MyOnChange()
{
if (Xrm.Page.getAttribute("field1").getValue() == "100000006") {
Xrm.Page.getControl("field2").setVisible(false);
Xrm.Page.getAttribute("field2").setRequiredLevel("none");
}
// If the selected value is not Other, hide Specify, and set requirement to Not Required
else {
Xrm.Page.getControl("field2").setVisible(true);
Xrm.Page.getAttribute("field2").setRequiredLevel("required");
}
}
此代码在我们的Dynamics CRM 2013中运行良好,旨在执行以下操作:
当Lead表单加载时,如果FIELD1的值设置为特定值,它将显示第二个字段FIELD2并使其成为必需的业务。
这里棘手的部分是,如果第一个字段在表单加载时包含该特定值,则第二个字段仅可见。如果由于某种原因,表单加载期间第一个字段的值不同,即使您选择该特定值,第二个字段也不会显示。
所以要恢复:
在表单加载中永远不会显示FIELD2
如果On Form Load FIELD1值等于X AND FIELD1值更改 - > SHOW FIELD2并使其成为必需
如果On Form Load FIELD1值不等于X且FIELD1值改变 - >即使FIELD1的选择变为X,也不会显示FIELD2,因为它最初不是X
我试图解释自己所以我希望我清楚这个实际的javascript是做什么的。
升级后的问题与“addEventListener”有关:
TypeError:无法读取null的属性“addEventListener” 在MyOnLoad
我想问一下是否有人可以帮助我们升级此Javascript,或者是否有可以取代此规则的业务规则。我实际上尝试过设置业务规则,但无法在业务规则中分离负载和更改的条件。
由于
答案 0 :(得分:5)
当您使用document.getElementById
时,不要像访问那样访问DOM。用Microsoft:
JavaScript开发人员习惯与Document Object进行交互 代码中的模型(DOM)元素。您可以使用window.getElementById 方法或jQuery库。您可以自由使用这些技术 您的HTML网络资源,但不支持访问元素 在Microsoft Dynamics 365应用程序页面或实体表单中。代替, 通过Xrm.Page对象公开对实体表单元素的访问 模型。 Microsoft Dynamics 365开发团队保留权利 更改页面的组成方式,包括ID值 元素,因此使用Xrm.Page对象模型可以保护您的代码 页面实现方式的变化。
在您的情况下,您可以改为使用支持的addOnChange:
Xrm.Page.getAttribute("field1").addOnChange(MyOnChange)