以下是正确的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中)。
答案 0 :(得分:1)
是的,这是预期的行为。引自MDN:
将指定的节点及其所有子树放入"标准化的" 形成。在规范化子树中,子树中没有文本节点为空 和没有相邻的文本节点。
具体过程为specified here(感谢 icktoofay 供参考):
对于上下文对象的每个
Text
节点后代:
- 让 node 成为
Text
节点后代。- 让长度为节点的
length
属性值。- 如果 length 为零,请删除 node 并继续使用下一个
Text
节点(如果有)。- 让 data 成为 node 的连续
Text
节点(不包括其自身)的数据的串联,按树顺序排列。- 将数据替换为节点节点,偏移长度,计数0和数据数据。
- 让当前节点成为节点的下一个兄弟。
- 当前节点是
Text
节点:
- 对于起始节点为当前节点的每个范围,将 length 添加到其起始偏移量,并将其起始节点设置为 node 。
- 对于其末端节点为当前节点的每个范围,将 length 添加到其结束偏移量并将其结束节点设置为 node 。
- 对于起始节点为当前节点的父节点和起始偏移量为当前节点索引的每个范围,将其起始节点设置为 node 及其起始偏移量为 length 。
- 对于端节点为当前节点的父节点和结束偏移量为当前节点索引的每个范围,将其结束节点设置为 node 及其结束偏移量 length 。
- 将当前节点的
length
属性值添加到长度。- 将当前节点设置为下一个兄弟。
- 按树顺序删除节点的连续
醇>Text
个节点(不包括其自身)。
所以是的,指定的行为是改变在连续文本节点集中找到的第一个文本节点,并删除后续文本节点。