Dom 解析在 IE11 中的 React App 上无法正常工作

Dom parsing doesn't correctly work on React App in IE11

提问人:Dragon14 提问时间:3/12/2020 最后编辑:Dragon14 更新时间:3/12/2020 访问量:361

问:

我非常厌倦了烧焦导致我的应用程序在 IE11 中无法正常工作的隐藏老鼠。我的 react App 在除 IE11 之外的所有浏览器中都能正常工作。IE11 支持是必不可少的。我从服务器获取数据,并在 ModalBar 中将其显示给用户。当我从订单表中选择订单并单击打印发票时,会出现模态栏,所有占位符都将用获得的数据填充。

这是在 Chrome 中: in chrome

现在这是在 IE11 中:enter image description here

从服务器获取的数据:enter image description here

我发现占位符不是作为对象出现的,也不是作为对象数组正确填充的,而是“操作”和“细节”占位符不是。操作和细节以对象数组的形式出现,我使用 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中的问题?老鼠在哪里?提前感谢您的帮助

JavaScript ReactJS Internet-Explorer DOM DomParser

评论

0赞 Daniel Lizik 3/12/2020
考虑使用与浏览器无关的 HTML AST 库,而不是DOMParser
0赞 Dragon14 3/12/2020
@Daniel你能附上一个链接到你的DOMParser类似物吗?
0赞 Daniel Lizik 3/12/2020
npmjs.com/package/html-parse-stringify
0赞 Yu Zhou 3/13/2020
IE 11 中的控制台有错误吗?如果您在 IE 和 Chrome 中记录未显示的数据,这些值会是什么样子?您是否在您认为可能有问题的代码部分添加了断点,以查看哪一行有问题?此外,您的意思是信息可以显示在网站上,但在打印时会丢失一些数据吗?
0赞 Dragon14 3/13/2020
@YuZhou 我透露,当我仅在 div 中呈现数据时,例如在页面本身上,数据也会丢失

答:

1赞 DHRUV GUPTA 3/12/2020 #1

这可能是因为您在 react 应用程序中使用了一些 es6 函数/样式的 javascript,并且在 IE11 中不起作用。 请确保您的 babel 配置正确以与 ie11 一起使用。 它应该是这样的:-

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

请参考此内容以获取更多 bable 文档

评论

0赞 Dragon14 3/12/2020
我使用 babel,package.json中有很多依赖项,以单词“babel”开头,我有 babelrc 文件。我应该把你提到的设置放在哪里?而且我不认为问题出在 babel 上,因为 es 的许多其他组件在 IE11 中工作正常
0赞 DHRUV GUPTA 3/16/2020
它应该在 babel 配置文件中