为什么 IE11 错误地处理 Node.normalize() 的减号?

2024-01-09

我遇到了一个问题,即当使用 Node.normalize() 函数连接相邻文本节点时,具有某些字符的 DOM 文本节点在 IE 中表现得很奇怪。

我创建了一个 Codepen 示例,它允许您在 IE11 中重现该错误:http://codepen.io/anon/pen/BxoKH http://codepen.io/anon/pen/BxoKH

IE11 中的输出:“- 示例”

Chrome 和早期版本 IE 中的输出:“测试 - 示例”

正如您所看到的,这会截断减号之前的所有内容,减号显然被视为定界字符,这显然是由于 Internet Explorer 11 中的 normalize() 本机实现中存在错误(但不是 IE10、IE8,甚至 IE6) )。

任何人都可以解释为什么会发生这种情况,并且有人知道导致此问题的其他字符序列吗?

Edit -我编写了一个 codepen,它将测试 Unicode 字符的各个部分,以识别导致此行为的字符。它影响的角色似乎比我最初意识到的要多得多:

http://codepen.io/anon/pen/Bvgtb/ http://codepen.io/anon/pen/Bvgtb/这会测试 32-1000 之间的 Unicode 字符,并打印那些未通过测试的字符(当节点规范化时截断数据)。您可以修改它以测试其他范围的字符,但要小心在 IE 中将范围增加太多,否则会冻结。

我创建了一个 IE 错误报告,并且 Microsoft 报告能够根据我提供的代码示例重现它。如果您也遇到此问题,请投票:https://connect.microsoft.com/IE/feedback/details/832750/ie11-node-normalize-dom-implementation-truncates-data-when-adjacent-text-nodes-contain-a-minus-sign https://connect.microsoft.com/IE/feedback/details/832750/ie11-node-normalize-dom-implementation-truncates-data-when-adjacent-text-nodes-contain-a-minus-sign


这里的其他答案有些冗长和不完整——它们没有遍历完整的 DOM 子树。这是一个更全面的解决方案:

function normalize (node) {
  if (!node) { return; }
  if (node.nodeType == 3) {
    while (node.nextSibling && node.nextSibling.nodeType == 3) {
      node.nodeValue += node.nextSibling.nodeValue;
      node.parentNode.removeChild(node.nextSibling);
    }
  } else {
    normalize(node.firstChild);
  }
  normalize(node.nextSibling);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 IE11 错误地处理 Node.normalize() 的减号? 的相关文章