Должен ли DOM разделить текст и нормализовать композицию, чтобы обеспечить идентичность?

StackOverflow https://stackoverflow.com/questions/30049

  •  09-06-2019
  •  | 
  •  

Вопрос

Вчера я был втянут в дискуссию о особенностях реализации DOM, что привело к интересному вопросу о поведении Text.splitText и Element.normalise и о том, как они должны себя вести.

В Ядро DOM уровня 1, Text.splitText определяется как...

Разбивает этот текстовый узел на два текстовых узла по указанному смещению, сохраняя оба в дереве как одноуровневые.Тогда этот узел содержит весь контент только до точки смещения.А новый текстовый узел, который вставляется как следующий одноуровневый узел этого узла, содержит весь контент в точке смещения и после нее.

Нормализовать - это...

Помещает все текстовые узлы на всю глубину поддерева под этим элементом в «нормальную» форму, в которой только разметка (например, теги, комментарии, инструкции обработки, разделы CDATA и ссылки на сущности) разделяет текстовые узлы, т. е. имеются нет соседних текстовых узлов.Это можно использовать для обеспечения того, чтобы представление DOM документа было таким же, как если бы он был сохранен и перезагружен, и полезно, когда необходимо использовать операции (такие как поиск XPointer), которые зависят от конкретной древовидной структуры документа.

Итак, если я возьму текстовый узел, содержащий «Hello World», на который есть ссылка в textNode, и сделаю

textNode.splitText(3)

textNode теперь имеет контент «Hello» и новый родственный элемент, содержащий «World».

Если я тогда

textNode.parent.normalize()

что такое textNode?В спецификации не разъясняется, что textNode должен оставаться дочерним элементом своего предыдущего родителя, просто обновляясь, чтобы содержать все соседние текстовые узлы (которые затем удаляются).Кажется, что это приемлемое поведение — удалить все соседние текстовые узлы, а затем воссоздать новый узел с конкатенацией значений, оставив textNode указывающим на что-то, что больше не является частью дерева.Или мы можем обновить textNode так же, как и в SplitText, чтобы он сохранял свою позицию в дереве и получал новое значение.

Выбор поведения действительно совсем другой, и я не могу найти разъяснений, какое из них правильное, или это просто недосмотр в спецификации (на уровнях 2 или 3 вроде бы не разъясняется).Может ли кто-нибудь из гуру DOM/XML пролить свет?

Это было полезно?

Решение

Вначале я был членом рабочей группы DOM;Я уверен, что мы имел в виду чтобы textNode содержал новое объединенное значение, но если бы мы этого не сделали сказать это в спецификации, возможно, что некоторый выполнение мощь создайте новый узел вместо повторного использования textNode, хотя это потребует дополнительной работы от разработчиков.

Если сомневаетесь, программируйте оборонительно.

Другие советы

Хотя это может показаться разумным предположением, я согласен, что в спецификации это явно не указано.Все, что я могу добавить, это то, что, как я это прочитал, одно из двух textNode или это новый брат (т.е.возвращаемое значение из splitText) будет содержать новое объединенное значение — оператор указывает, что все узлы в поддереве приводятся в нормальную форму, а не то, что поддерево нормализуется к новой структуре.Я думаю, единственное безопасное решение — сохранить ссылку на родителя перед нормализацией.

Я думаю, что здесь все ставки сделаны;Я определенно не стал бы зависеть от какого-либо поведения.Единственное безопасное решение — это снова получить узел от его родителя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top