Почему Removechild нужен родительский узел?
-
26-09-2019 - |
Вопрос
После ответа этот вопрос Я остался вопросом, почему removeChild
нужен родительский элемент. В конце концов, мы могли бы просто сделать
node.parentNode.removeChild(node);
Поскольку родительский узел должен всегда быть непосредственно доступен для двигателя JavaScript / DOM, он не является строго необходимым для подачи родительского узла узла, который должен быть удален.
Конечно, я понимаю принцип, который removeChild
это метод узла DOM, но почему не так document.removeNode
существуют (что просто принимает произвольный узел в качестве параметра)?
РЕДАКТИРОВАТЬ: Чтобы быть более понятным, вопрос: почему двигатель JS вообще нужен родительский узел, если он уже имеет (уникальный) узел, который будет удален?
Решение
Я думаю, что это сохраняет дизайн простой. Узел мая существуют в изоляции, но более интересный случай - дерево DOM. С участием removeChild
, Быть удаленным узлом должно быть ребенком узла, на котором назывался метод.
Получение списка всех детей и выполнение ручного сравнения против каждой не так дорогой операция. Однако поиск всех потомков для узла, который должен быть удален, действительно дорого.
Редактировать: В ответ на ваше обновление браузер просто реализует Dom Spec., который определяет removeChild
метод включения Node
. Отказ Спецификация, я считаю, должен быть однозначным и свободен от предположений. Это похоже на Внедрение зависимости с этого перспективы. SPEC DOM CORE SPEC моделирует дерево, использующее строительные блоки, такие как узел, элемент и т. Д., Добавление метода одинокого, такого как removeNode
Где-то в этих строительных блоках означает, что метод неявит знания о своей среде - что это may
Будьте ребенком некоторых узлов, и его следует удалить оттуда, если оно есть.
Задача W3 состоит в том, чтобы сделать очень надежную API, что делает большинство возможных возможных. Они не должны беспокоиться о синтаксическом сахаре, как это всегда можно записать вокруг собственных API, если они хорошо написаны.
Другие советы
Путаница может быть, потому что вы могли бы подумать, что удаление элемента означает что-то вроде убийства или уничтожения его.
Но на самом деле концепция удаление В основном означает нарушение отношений между ребенком и его родителем. Это просто отряд.
Следовательно, удаляя элемент, который не имеет родительского узла, не имеет смысла. И разумно, что, если вы хотите нарушить эту связь между родителем и ребенком, вам нужна ссылка на обои.
Тем не менее, это правда, что иногда вы просто хотите удалить ребенка от своего родителя, не заботясь об этом родиве. Вот почему DOM Уровень 4 представляет ChildNode
Интерфейс, который обеспечивает remove
метод.
Этот интерфейс реализован DocumentType
, Element
а также CharacterData
, так что вы можете использовать его на дочинка, элементы а также Text
, Comment
, а также ProcessingInstruction
узлы.
Предположить node
это один из них, вы можете использовать
node.remove();
В случае, если у него уже нет родительского узла, ничего не происходит.