Разбор Dom не работает правильно на React App в IE11 - PullRequest
2 голосов
/ 12 марта 2020

Я очень устал от поиска скрытой крысы, которая заставляет мое приложение работать некорректно в IE11. Приложение «Мой ответ» работает правильно во всех браузерах, кроме IE11. Поддержка IE11 обязательна. Я получаю данные с сервера и показываю их пользователю в ModalBar. Когда я выбираю заказ из таблицы заказов и нажимаю на печать счета, появляется модальная панель, и все заполнители будут заполнены полученными данными.

это chrome: in chrome

и теперь это в IE11: enter image description here

данные, полученные с сервера: enter image description here

I Выяснилось, что заполнители, которые идут не как объекты, а не как массивы объектов, заполнены правильно, а заполнители «ops» и «details» нет. Операции и детали представляют собой массив объектов, и я использую DOMParser для работы с ними. Вот код:

prepareDocumentContent(document, documentData) {
let content = document.body;
console.log(88888888880, content);
if (isObject(documentData)) {
  const placeholders = document.placeholders.split(',').map(item => item.trim());
  let parsedArrays = [];
  for(let k = 0; k < placeholders.length; k++) {
    const placeholder = placeholders[k];
    const isObjectValue = placeholder.includes('.');
    if (isObjectValue) {
      const objectName = placeholder.split('.')[0];
      if (documentData[objectName] instanceof Array) {
        if (parsedArrays.indexOf(objectName) < 0) {
          parsedArrays = [
            ...parsedArrays,
            objectName
          ];
          const parser = new DOMParser();
          const doc = parser.parseFromString(content, 'text/html');
          const elements = doc.getElementsByClassName(objectName);
          for (let ei = 0; ei < elements.length; ei++) {
            const element = elements.item(ei);
            let replace = '';
            const arr = documentData[objectName];
            for (let i = 0; i < arr.length; i++) {
              let newElement = element.outerHTML;
              console.log('newElement', newElement);
              const item = arr[i];
              const names = Object.keys(item);
              for (let j = 0; j < names.length; j++) {
                const itemName = names[j];
                const regex = new RegExp(`{${objectName}` + '.' + `${itemName}}`, 'g');
                const replacing = typeof item[itemName] === 'undefined'
                  ? (!this.props.isIgnoreNotSpecified ? i18n.t('ModalWysiwygBar.not_specified') : '')
                  : item[itemName];
                console.log('replacing', replacing);
                newElement = newElement.replace(
                  regex,
                  replacing
                );
              }
              replace = replace + newElement;
              console.log('replace', replace);
            }
            content = content.replace(element.outerHTML, replace);
            console.log('contentObtained', content);
          }
        }
      } else {
        const regex = new RegExp(`{${placeholder}}`, 'g');
        const objectNotExists = typeof documentData[objectName] === 'undefined' || typeof documentData[objectName][placeholder.split('.')[1]] === 'undefined';
        const replacing = objectNotExists? (!this.props.isIgnoreNotSpecified ? i18n.t('ModalWysiwygBar.not_specified') : '' )
          : documentData[objectName][placeholder.split('.')[1]];
        content = content.replace(
          regex,
          replacing
        );
      }
    } else {
      const regex = new RegExp(`{${placeholder}}`, 'g');
      const replacing = !documentData[placeholder]
        ? (!this.props.isIgnoreNotSpecified ? i18n.t('ModalWysiwygBar.not_specified') : '')
        : documentData[placeholder];
      content = content.replace(
        regex,
        replacing
      );
    }
  }
} else {
  content = documentData.replace(/\n/g, '<br />');
}
const placeholders = document.placeholders.split(',');
placeholders.map(placeholder => {
  const regex = new RegExp(`{${placeholder}}`, 'g');
  const replacing = !this.props.isIgnoreNotSpecified ? i18n.t('ModalWysiwygBar.not_specified') : '';
  content = content.replace(
    regex,
    replacing
  );
});
return content;
}

Я думаю, проблема в этом разделе кода:

if (documentData[objectName] instanceof Array) {
        if (parsedArrays.indexOf(objectName) < 0) {
          parsedArrays = [
            ...parsedArrays,
            objectName
          ];
          const parser = new DOMParser();
          const doc = parser.parseFromString(content, 'text/html');
          const elements = doc.getElementsByClassName(objectName);
          for (let ei = 0; ei < elements.length; ei++) {
            const element = elements.item(ei);
            let replace = '';
            const arr = documentData[objectName];
            for (let i = 0; i < arr.length; i++) {
              let newElement = element.outerHTML;
              console.log('newElement', newElement);
              const item = arr[i];
              const names = Object.keys(item);
              for (let j = 0; j < names.length; j++) {
                const itemName = names[j];
                const regex = new RegExp(`{${objectName}` + '.' + `${itemName}}`, 'g');
                const replacing = typeof item[itemName] === 'undefined'
                  ? (!this.props.isIgnoreNotSpecified ? i18n.t('ModalWysiwygBar.not_specified') : '')
                  : item[itemName];
                console.log('replacing', replacing);
                newElement = newElement.replace(
                  regex,
                  replacing
                );
              }
              replace = replace + newElement;
              console.log('replace', replace);
            }
            content = content.replace(element.outerHTML, replace);
            console.log('contentObtained', content);
          }
        }
      }

другие разделы кода в этой функции выполняют свою работу правильно. Я проверил журналы консоли в IE11, и кажется, что функция начинает работать правильно, но из вывода я получаю сокращенную html строку. И проводник не показывает, является ли строка сокращенной или нет при наведении курсора мыши. Ничего не понятно. Я прикрепил экраны chrome и IE.

Chrome, все в порядке: enter image description here

IE11, простая укороченная строка: enter image description here

enter image description here

Почему IE11 не показывает полную строку, как другие браузеры? И с другой точки зрения, если IE11 не будет правильно формировать строку html, то html будет разбит и никакие данные не будут отображаться в modalBar. Но есть все таблицы со всей указанной структурой, за исключением некоторых незаполненных заполнителей. Я думаю, это означает, что IE11 формирует html строку правильно, но просто не показывает полную строку в своей консоли. Но почему? и IE11 начинает правильно заполнять операции и детали, но опять же, в конце, он показывает сокращенную строку и плачевный результат в модальном окне.

Как преодолеть проблему в IE11? где крыса? Заранее спасибо за помощь

1 Ответ

1 голос
/ 12 марта 2020

Это может быть связано с тем, что вы используете некоторые функции / стили es6 javascript в своем приложении реагирования, а оно не работает в IE11. Пожалуйста, убедитесь, что ваш babel настроен правильно для работы с ie11. это должно быть что-то вроде этого: -

{
  "targets": {
    "chrome": "58",
    "ie": "11"
  }
}

Пожалуйста, обратитесь к этому для получения дополнительной документации bable

...