Forum Webscript.Ru

Программирование => JavaScript & JScript => Тема начата: dub от 12 Марта 2003, 17:46:11

Название: Удаление узла и всех его детей
Отправлено: dub от 12 Марта 2003, 17:46:11
Пытаюсь написать функцию deleteNode()  для удаления узла и всех его прямых и опосредованных детей. По идее эта функция должна вызываться рекурсивно, если дети есть, для каждого из детей. А если у них есть дети, то для каждого из их детей. Когда же у узла не остается детей, то удалять его методом removeNode(). Как бы это сотворить?
Название: Удаление узла и всех его детей
Отправлено: mike от 12 Марта 2003, 17:53:46
Ну и в чем проблема, собственно?
Название: Удаление узла и всех его детей
Отправлено: dub от 12 Марта 2003, 18:26:02
mike
Хороший вопрос. Просто не захотел выкладывать то, что не хочет работать. Вот оно:
function deleteNode(object) {
var i;
if (object.tagName && object.childNodes) {
for(i=0; i childNode = object.childNodes[i];
deleteNode(childNode);
}
}
else object.removeNode();
}

Если дети только непосредственные, то все замечательно. А вот если их два уровня, то удаляются только самые младшие. И что-тоя не пойму, почему так.
Название: Удаление узла и всех его детей
Отправлено: mike от 12 Марта 2003, 18:43:40
А корневой узел в твоем варианте удаляется?
Думаю, вот в чем проблема. После удаления потомков нужно удалить сам узел, а у тебя этого нет. Проверь этот вариант:

function deleteNode(object) {
var i;
if (object.tagName && object.childNodes) {
for(i=0; i childNode = object.childNodes[i];
deleteNode(childNode);
}
}
object.removeNode();
}
Название: Удаление узла и всех его детей
Отправлено: dub от 12 Марта 2003, 18:52:06
mike
Так пробовал. Вот что получается. Если у корневого узла двое детей, каждый из которых имеет своих детей, то прохождение вглубь происходит только один раз, а после этого удаляется корневой узел. Второй же ребенок зависает. Пример: необходимо удалить строку таблицы:

1
2

После применения такой функции имеем вот что:
2
Вот
Цитировать
в чем проблема, собственно
Название: Удаление узла и всех его детей
Отправлено: mike от 12 Марта 2003, 19:12:40
Кажется, понял. :) Условие окончания цикла у тебя
i < object.childNodes.length, но ведь это динамическая величина, и при удалении потомка она уменьшается, а i наоборот, увеличивается. И тогда уж (чтобы совсем аккуратно было), лучше удалять с конца:

function deleteNode(object) {
if (object.tagName && object.childNodes) {
for(var i=object.childNodes.length-1; i>=0; i--) {
childNode = object.childNodes[i];
deleteNode(childNode);
}
}
object.removeNode();
}
Название: Удаление узла и всех его детей
Отправлено: dub от 12 Марта 2003, 19:16:44
mike
Ого.. Браво..