Как манипулировать DOM в Dynamics CRM с помощью jQuery

Попытка манипулировать DOM путем обновления значения поля с помощью метода добавления jQuery.

Обнаружено, что манипуляции с DOM не разрешены в Dynamics CRM с использованием обычного JavaScript или JQuery

Поэтому попытался добавить веб-ресурс HTML со сценариями на его вкладке источника:

Функция добавляется в форму проекта и настраивается для вызова на OnLoad событие. Однако он вызывается до загрузки формы.

Функция работает хорошо, когда выполняется в console, но при вызове системой это не работает.

  setTimeout(ShowProjectAge, 3000);

  function ShowProjectAge() {

    var createdOn = Xrm.Page.getAttribute("createdon");
    var createdOnDt = new Date(createdOn.$2_2.$2T_2);
    var today = new Date();
    var DiffDays = GetDiffDays(createdOnDt, today);

    //var projectAge = $('#processDuration').html();
    //$('#HeaderTilesWrapperLayoutElement').html(projectAge);
    //$('#HeaderTilesWrapperLayoutElement').css('color','black');

    console.log('The Project Age is ' + DiffDays);
    var div = $('#HeaderTilesWrapperLayoutElement');
    div.text('The Project Age is ' + DiffDays + ' days');
    div.css('color', 'black');
    div.css('font-weight', 'bold');
  }

  function GetDiffDays(date1, date2) {
    var timeDiff = Math.abs(date2.getTime() - date1.getTime());
    return Math.round(timeDiff / (1000 * 3600 * 24));
  }

На полностью загруженном DOM, ShowProjectAge хорошо работает Однако при вызове из системы он не загружается.

Пробовал с помощью document.ready уже

3 ответа

Решение

Исходя из моего понимания DOM Dynamics CRM, все javascript-коды находятся в отдельном пустом фрейме.

Элементы формы находятся внутри другого пустого iframe.

Обратите внимание, что они оба находятся в одном и том же окне, поэтому измените строку с этого:

var div = $('#HeaderTilesWrapperLayoutElement');

к этому:

var div = $('#HeaderTilesWrapperLayoutElement', window.parent.document);

Во-первых, никогда не делайте никаких манипуляций с DOM в CRM. Это не стоит усилий. Когда-либо.

Во-вторых, это можно сделать из коробки с нулевым кодом:

  1. Создать пользовательское вычисляемое поле
  2. Используйте эту формулу: DiffInDays(madeon, Now())
  3. Поместите это поле в форму где вы хотите

В-третьих, это совершенно неправильно:

var createdOn = Xrm.Page.getAttribute("createdon");
var createdOnDt = new Date(createdOn.$2_2.$2T_2);

Вы можете получить дату, как это:

var createdOnDt = Xrm.Page.getAttribute("createdon").getValue();

У вас есть два варианта: во-первых, вы можете включить "рендеринг устаревших форм", включить рендеринг устаревших или вы должны рефакторинг своего кода и использовать для поддерживаемого метода ссылку на документацию

но я думаю, вы не можете изменить в css с помощью Xrm.Page

Другие вопросы по тегам