Dynamics CRM 表单的客户端大小操作

Client-size manipulation of a Dynamics CRM Form

原问题:

我正在尝试创建一些 javascript 以添加到 Microsoft Dynamics CRM 中的表单。

我有以下脚本,我已将其分配给表单 onLoad 事件:

$(document).ready(function () {

    if ($('#CheckBox1').is(':checked')) {

        $('<div id="div2">Some Data Here</div>').insertAfter("#Div1");

        $('#divHeader').height('+=25px');

        var newtop = $('#divMain').position().top + 25;
        $('#divMain').css('top', newtop + 'px');
    }

});

以下是表格的精简版 HTML

<div id="divHeader">
    <div id="Div1"></div>
</div>

<div id="divMain"></div>

加载表单时,应该发生的是:

<div id="divHeader">
    <div id="Div1"></div>
    <div id="Div2">Some Data Here</div>
</div>

<div id="divMain"></div>

这确实发生了。但是,问题是 divHeaderdivMain 没有调整大小,所以新添加的 Div2 除非用户在 divHeader 中向下滚动才能看到。

如果我添加警报:

$(document).ready(function () {

    if ($('#CheckBox1').is(':checked')) {

        alert("Random alert");

        $('<div id="div2">Some Data Here</div>').insertAfter("#Div1");

        $('#divHeader').height('+=25px');

        var newtop = $('#divMain').position().top + 25;
        $('#divMain').css('top', newtop + 'px');
    }

});

整个过程完美无缺。我如何在没有警报的情况下让它工作?


更新 1:

setTimeout 也可以代替 alert.

$(document).ready(function () {

    setTimeout(function () {
        if ($('#CheckBox1').is(':checked')) {

            $('<div id="div2">Some Data Here</div>').insertAfter("#Div1");

            $('#divHeader').height('+=25px');

            var newtop = $('#divMain').position().top + 25;
            $('#divMain').css('top', newtop + 'px');

        }
    }, 5000);

});

看来 $(document).ready 似乎没有正确完成它的工作。在这两种情况下 alertsetTimeout,在调整 div 标签大小之前,表单有额外的时间来完成加载。

使用 Jquery 插件 Wait until element exists 插件将等待元素出现在 DOM 中,然后触发给定的处理函数。

$(document).ready(function () {

    $('#CheckBox1').waitUntilExists(function () { //  OR $('#Div1').waitUntilExists(function ()
        if ($('#CheckBox1').is(':checked')) {

            $('<div id="div2">Some Data Here</div>').insertAfter("#Div1");

            $('#divHeader').height('+=25px');

            var newtop = $('#divMain').position().top + 25;
            $('#divMain').css('top', newtop + 'px');

        }
    });

});

完全不支持在 Dynamics CRM 中进行 DOM 操作。参见 Do Not Access the DOM

您将需要使用受支持的方法来操作表单(即 Xrm.Page)。虽然无法在 CRM 表单上动态 add/remove 内容,但您可以显示和隐藏元素。据我了解,如果表单上的布尔字段(显示为复选框)为真,您将尝试显示一些内容。

这可以通过将您想要 show/hide 的控件添加到您的表单来完成(该控件可以是标准 CRM 字段之一,也可以是自定义 Web 资源,具体取决于您的要求)。然后,当您的布尔属性更改其值时,您将 JavaScript 写入 show/hide 有问题的控件:

function onload() {
    Xrm.Page.getAttribute("booleanField").addOnChange(showMoreStuffInHeader);
    showMoreStuffInHeader();
}

function showMoreStuffInHeader() {
    var visible = Xrm.Page.getAttribute("booleanField").getValue();
    Xrm.Page.getControl("someDataHereControl").setVisible(visible);
}