Автор Тема: Удаление узла и всех его детей  (Прочитано 3531 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dub

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 236
  • +0/-0
  • 0
    • Просмотр профиля
    • http://binartis.com/
Удаление узла и всех его детей
« : 12 Марта 2003, 17:46:11 »
Пытаюсь написать функцию deleteNode()  для удаления узла и всех его прямых и опосредованных детей. По идее эта функция должна вызываться рекурсивно, если дети есть, для каждого из детей. А если у них есть дети, то для каждого из их детей. Когда же у узла не остается детей, то удалять его методом removeNode(). Как бы это сотворить?

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Удаление узла и всех его детей
« Ответ #1 : 12 Марта 2003, 17:53:46 »
Ну и в чем проблема, собственно?
[ основной браузер когда-то был, теперь попробуй разберись =]

Оффлайн dub

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 236
  • +0/-0
  • 0
    • Просмотр профиля
    • http://binartis.com/
Удаление узла и всех его детей
« Ответ #2 : 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

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Удаление узла и всех его детей
« Ответ #3 : 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

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 236
  • +0/-0
  • 0
    • Просмотр профиля
    • http://binartis.com/
Удаление узла и всех его детей
« Ответ #4 : 12 Марта 2003, 18:52:06 »
mike
Так пробовал. Вот что получается. Если у корневого узла двое детей, каждый из которых имеет своих детей, то прохождение вглубь происходит только один раз, а после этого удаляется корневой узел. Второй же ребенок зависает. Пример: необходимо удалить строку таблицы:

1
2

После применения такой функции имеем вот что:
2
Вот
Цитировать
в чем проблема, собственно

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Удаление узла и всех его детей
« Ответ #5 : 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

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 236
  • +0/-0
  • 0
    • Просмотр профиля
    • http://binartis.com/
Удаление узла и всех его детей
« Ответ #6 : 12 Марта 2003, 19:16:44 »
mike
Ого.. Браво..

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28