Оказывается, здесь не происходит ничего волшебного.Ошибка, которую я сделал, состояла в том, чтобы рассматривать только элементы вместо всех узлов.При переупорядочении привязка к выбивающему шаблону сохраняет записи всех узлов, а не только элементов.
Перед ручным редактированием DOM дочерние узлы привязки шаблона:
NodeList(6) [text, div, text, text, div, text]
.
После ручной замены первых двух элементов с помощью parent.insertBefore(parent.children[1], parent.children[0])
это превращается в:
NodeList(6) [text, div, div, text, text, text]
.
Повтор действия приводит к:
NodeList(6) [text, div, div, text, text, text]
.
Хотя это идентично исходному состоянию при обращении только к элементам , оно совершенно отличается при обращении ко всем узлам .
Решение теперь становится ясным.Один из способов выполнить правильный ручной обмен - это заменить
parent.insertBefore(parent.children[1], parent.children[0]);
на
let nexts = [parent.children[0].nextSibling, parent.children[1].nextSibling];
parent.insertBefore(parent.children[1], nexts[0]);
parent.insertBefore(parent.children[0], nexts[1]);
, как показано в https://jsfiddle.net/k7u5wep9/2/.
Очевидно, большенужно соблюдать осторожность, когда нет текстовых узлов до / после, но идея остается прежней.