Вопрос

После ответа этот вопрос Я остался вопросом, почему 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, если они хорошо написаны.

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

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

enter image description here

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

enter image description here

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

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

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

Предположить node это один из них, вы можете использовать

node.remove();

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

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