После ответа на на этот вопрос мне остается только удивляться, почему removeChild
нуждается в родительском элементе. В конце концов, мы могли бы просто сделать
node.parentNode.removeChild(node);
, поскольку родительский узел всегда должен быть напрямую доступен для механизма Javascript / DOM, нет необходимости указывать родительский узел узла, который должен быть удален.
Конечно Я понимаю принцип, согласно которому removeChild
является методом узла DOM, но почему-то не похоже на документ . removeNode
существует (который просто принимает произвольный узел в качестве параметра)?
РЕДАКТИРОВАТЬ: Чтобы быть более ясным, вопрос: зачем движку JS вообще нужен родительский узел, если он уже (уникальный) узел, который нужно удалить?
Думаю, это упрощает дизайн. Узел может существовать изолированно, но более интересным случаем является дерево DOM. С removeChild
удаляемый узел должен быть дочерним по отношению к узлу, на котором был вызван метод.
Получение списка всех детей и ручное сравнение каждого из них - не такая дорогая операция.Однако поиск по всем потомкам узла, который нужно удалить, действительно стоит дорого.
Изменить : в ответ на ваше обновление браузер просто реализует спецификацию DOM , которая определяет метод removeChild
на узле
. Спецификация на мой взгляд должна быть недвусмысленной и свободной от предположений. С этой точки зрения он похож на Внедрение зависимостей . Спецификация DOM Core моделирует дерево с использованием строительных блоков, таких как Node, Element и т. Д. Добавление отдельного метода, такого как removeNode
где-то в этих строительных блоках, означает, что метод неявно знает свою среду - что он ] может быть
дочерним элементом некоторого узла, и его следует удалить оттуда, если это так.
Задача w3 - создать очень надежный API, который делает возможным большинство вещей. Им не следует беспокоиться о синтаксическом сахаре, поскольку его всегда можно написать на основе собственных API-интерфейсов, если они хорошо написаны.