Почему removeChild нужен родительский node?
После ответа на этот вопрос мне осталось интересно, почему removeChild
родительский элемент. В конце концов, мы могли просто сделать
node.parentNode.removeChild(node);
Поскольку родительский node должен всегда быть доступен непосредственно механизму Javascript/DOM, нет необходимости поставлять родительский node из node, который должен быть удален.
Конечно, я понимаю принцип, что removeChild
- метод DOM node, но почему не существует нечто вроде document.removeNode
(которое просто принимает произвольный параметр node)?
EDIT:. Чтобы быть более понятным, возникает вопрос: почему движок JS нуждается в родительском node вообще, если он уже имеет (уникальный) node, который нужно удалить
Ответы
Ответ 1
Я думаю, что это упрощает дизайн. A node может существовать изолированно, но более интересным является дерево DOM. С removeChild
удаляемый node должен быть дочерним элементом node, на котором был вызван метод.
Получение списка всех детей и сравнение вручную с каждым из них не так дорого. Однако поиск всех потомков для node, который должен быть удален, действительно дорого.
Изменить. В ответ на ваше обновление браузер просто реализует спецификацию DOM, которая определяет removeChild
на Node
. Спектр, на мой взгляд, должен быть однозначным и свободным от допущений. Это похоже на Injection Dependency с этой точки зрения. Спецификация DOM Core моделирует дерево с использованием строительных блоков, таких как Node, Element и т.д. Добавление одиночного метода, такого как removeNode
где-то в этих строительных блоках, означает, что метод имеет неявные знания о своей среде, - что он may
be дочерний элемент из Node, и он должен быть удален оттуда, если он есть.
Задача w3 - создать очень надежный API, который делает все возможное. Они не должны беспокоиться о синтаксическом сахаре, поскольку они всегда могут быть написаны вокруг родных API, если они хорошо написаны.
Ответ 2
Путаница может быть вызвана тем, что вы думаете, что удаление элемента означает что-то вроде убийства или уничтожения.
![введите описание изображения здесь]()
Но на самом деле концепция удаление в основном означает нарушение отношений между дочерним и его родительским. Это просто отряд.
![введите описание изображения здесь]()
Следовательно, удаление элемента, не имеющего родительского элемента node, не имеет смысла. И разумно, что если вы хотите разорвать это соединение между родителем и дочерним, вам нужна ссылка на оба.
Тем не менее, правда, иногда вы просто хотите удалить ребенка из своего родителя, не заботясь об этом родителе вообще. Поэтому DOM Level 4 представляет интерфейс ChildNode
, который предоставляет remove
.
Этот интерфейс реализован DocumentType
, Element
и CharacterData
, поэтому вы можете использовать его на doctypes, элементы и Text
, Comment
и ProcessingInstruction
узлы.
Предполагая, что node
является одним из них, вы можете использовать
node.remove();
Если у него уже нет родителя node, ничего не происходит.