Почему 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, ничего не происходит.