JavaScript Node.normalize()行为还是bug?

JavaScript Node.normalize()行为还是bug?,javascript,Javascript,以下是正确的JavaScript行为还是JavaScript引擎错误 var a = document.createTextNode('a'); var b = document.createTextNode('b'); var foo = document.createElement('foo'); foo.appendChild(a); foo.appendChild(b); foo.normalize(); console.log(a.textContent); 我本以为这会记录“a”,

以下是正确的JavaScript行为还是JavaScript引擎错误

var a = document.createTextNode('a');
var b = document.createTextNode('b');
var foo = document.createElement('foo');
foo.appendChild(a);
foo.appendChild(b);
foo.normalize();
console.log(a.textContent);

我本以为这会记录“a”,但normalize()会更改foo的初始子文本节点,因此它会记录“ab”(至少在Firefox和Chrome中是这样)。

是的,这是预期的行为。引述自:

将指定的节点及其所有子树放入“规范化”节点 形式。在规范化子树中,子树中没有文本节点为空 并且没有相邻的文本节点

精确的过程是(感谢icktoofay的参考):

对于上下文对象的每个
文本
节点后代:

  • 让节点成为
    文本
    节点的后代
  • 将长度设为节点的
    length
    属性值
  • 如果长度为零,请删除节点并继续下一个
    文本
    节点(如果有)
  • 设数据为节点连续
    文本
    节点(不包括自身)的数据按树顺序串联
  • 用节点、偏移长度、计数0和数据替换数据
  • 让当前节点成为节点的下一个同级节点
  • 当前节点是
    文本
    节点时:
    
  • 对于起始节点为当前节点的每个范围,将长度添加到其起始偏移量,并将其起始节点设置为节点
  • 对于结束节点为当前节点的每个范围,将长度添加到其结束偏移,并将其结束节点设置为节点
  • 对于起始节点为当前节点父节点且起始偏移量为当前节点索引的每个范围,将其起始节点设置为节点,将其起始偏移量设置为长度
  • 对于结束节点为当前节点父节点且结束偏移量为当前节点索引的每个范围,将其结束节点设置为节点,将结束偏移量设置为长度
  • 将当前节点的
    length
    属性值添加到length
  • 将当前节点设置为其下一个同级节点
  • 按树顺序删除节点的连续
    文本
    节点(不包括自身)

  • 因此,是的,指定的行为是变异在连续文本节点集中找到的第一个文本节点,并删除后续的文本节点。

    该标准看起来确实描述了变异第一个子节点。谢谢