Почему для removeChild нужен родительский узел? - PullRequest
13 голосов
/ 06 августа 2010

После ответа на этот вопрос мне остается только удивляться, почему removeChild нуждается в родительском элементе. В конце концов, мы могли бы просто сделать

node.parentNode.removeChild(node);

Поскольку родительский узел всегда должен быть непосредственно доступен для механизма Javascript / DOM, нет необходимости указывать родительский узел узла, который должен быть удален.

Конечно, я понимаю принцип, согласно которому removeChild является методом узла DOM, но почему не существует чего-то вроде document.removeNode (которое просто принимает произвольный узел в качестве параметра)?

РЕДАКТИРОВАТЬ: Чтобы быть более ясным, вопрос: зачем движку JS вообще нужен родительский узел, если у него уже есть (уникальный) узел, который должен быть удален?

Ответы [ 2 ]

7 голосов
/ 06 августа 2010

Я думаю, что это делает дизайн простым.Узел может существовать изолированно, но более интересным случаем является дерево DOM.При removeChild удаляемый узел должен быть дочерним по отношению к узлу, на котором был вызван метод.

Получение списка всех детей и сравнение каждого из них вручную - не такая уж и дорогая операция.Однако поиск всех потомков по узлу, который должен быть удален, действительно дорог.

Редактировать : В ответ на ваше обновление браузер просто реализует спецификацию DOM , который определяет метод removeChild для Node.Спецификация, по моему мнению , должна быть однозначной и свободной от предположений.Это похоже на Внедрение зависимостей с этой точки зрения.Спецификация DOM Core моделирует дерево, используя строительные блоки, такие как Node, Element и т. Д. Добавление одного метода, такого как removeNode, где-то в этих строительных блоках означает, что метод неявно знает о своей среде - что он may будет дочернимнекоторого узла, и он должен быть удален оттуда, если он есть.

Задача w3 - создать очень надежный API, который делает большинство вещей возможным.Они не должны беспокоиться о синтаксическом сахаре, так как он всегда может быть написан вокруг нативных API, если они хорошо написаны.

1 голос
/ 15 марта 2016

Путаница может быть вызвана тем, что вы думаете, что удаление элемента означает что-то вроде его уничтожения или уничтожения.

enter image description here

Но на самом деле, концепция удаление в основном означает разрыв отношений между ребенком и его родителем.Это просто отделение.

enter image description here

Поэтому удаление элемента, у которого нет родительского узла, не имеет смысла.И вполне разумно, что если вы хотите разорвать эту связь между родителем и ребенком, вам нужна ссылка на обоих.

При этом верно, что иногда вы просто хотите удалить ребенка от его родителя,не заботясь об этом родителе вообще.Вот почему DOM Level 4 представляет интерфейс ChildNode, который обеспечивает метод remove.

Этот интерфейс реализован с помощью DocumentType, Element и CharacterData, поэтому вы можете использовать его на типах , элементах и Text, Comment и ProcessingInstruction узлов .

Предполагая, что node является одним из них, вы можетеиспользуйте

node.remove();

Если у него уже нет родительского узла, ничего не происходит.

...