Как добавить тег br в тело композитора Outlook через setAsync?

Я пишу надстройку Outlook, используя API 1.4, и пытаюсь добавить тег br в тело композитора Outlook 2016.

Однако, как только пользователь начинает печатать, Outlook переформатирует документ и удаляет элемент.

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

Office.context.mailbox.item.body.getAsync(
  Office.CoercionType.Html, {
    asyncContext: "Body"
  },
  function(asyncResult) {
    // DOMParser
    var doc = document.implementation.createHTMLDocument("document");
    doc.documentElement.innerHtml = asyncResult.value;

    // Append <br> if not found
    var isModified = false;
    var $html = $(doc.documentElement);
    var $body = $html.find("body"); 
    if (!!$body.find("br[id*='unique-identifier']").length) {
      $body.append("<br id='unique-identifier'>");
      isModified = true;
    }

    // Set if <br> was not found
    if (isModified) {
      Office.context.mailbox.item.body.setAsync(
        $body.html(), {
          coercionType: Office.CoercionType.Html
        }
        function(asyncResult) {}
      )
    }
  }
);

Последующий getAsync показывает тег br до тех пор, пока вы не начнете печатать, затем он удаляется, а setAsync вызывается снова. Это раздражает, поскольку setAsync заставляет курсор переходить в начало композитора и мешает пользователю плавно печатать. В этом случае я не могу использовать prepend или setSelectedDataAsync из-за характера тега br.

Я предполагаю, что переформатирование происходит путем преобразования простого HTML в документ Word на основе значения asyncResult, но я не знаю, как это учитывать.

NB: это также отличается от OWA, который не выполняет преобразование между Word Doc и HTML, но ставит перед id и другими атрибутами, такими как class, префикс x_ и заставляет курсор прыгать.


person SirTophamHatt    schedule 12.12.2016    source источник
comment
Вы пытались имитировать свой тег ‹br /› с помощью div или span? Это тоже будет удалено: ‹div id='your_id' style='clear:both'›‹/div›?   -  person Slava Ivanov    schedule 13.12.2016
comment
Div со стилем и работает, а пустой div - нет. Существуют ли определенные ограничения на то, что считается допустимым в Outlook?   -  person SirTophamHatt    schedule 13.12.2016
comment
документация не ограничивает вас в использовании каких-либо тегов HTML. Проблема с пустыми тегами (отдельно br или пустой div) — это просто внутренняя оптимизация содержимого тела Outlook. Когда вы будете использовать некоторые значения, теги не будут удалены. По крайней мере, ваша проблема решена, не так ли?   -  person Slava Ivanov    schedule 13.12.2016
comment
Каждый фактически ограничен тем, что можно установить с помощью оптимизации Outlook. OWA изменяет незначительные элементы тела, такие как атрибуты, но Outlook полностью переформатирует HTML и стили. Если я задаю тело с помощью HTML, форматирование должно отражать то, что я попросил установить, а не то, что оптимизирует Outlook. Это может быть небольшой способ обойти Outlook, но это не универсальный способ.   -  person SirTophamHatt    schedule 19.12.2016


Ответы (1)


Я создал прототип для отображения элемента br в теле письма. Вы можете попробовать следующий код:

Office.initialize = function () {   
    $(document).ready(function () {
        Office.context.mailbox.item.body.setAsync("<span>begin</span><br id='unique-identifier' /><span>end</span>",  {coercionType: Office.CoercionType.Html});
    }
}

После запуска между началом и концом есть br. Посетите https://dev.outlook.com/reference/add-ins/Body.html#setAsync, чтобы найти дополнительную информацию.

person Frank    schedule 30.12.2016