2009-11-10 2 views
1

У меня есть список элементов на странице, для обсуждения можно сказать, у меня есть следующий:Удалить родительский элемент после удаления последнего потомка элемента

<div id="group_01"> 
    <div id="entry_1-01">stuff <a href="delete">x</a></div> 
    <div id="entry_1-02">stuff <a href="delete">x</a></div> 
</div> 

<div id="group_02"> 
    <div id="entry_2-01">stuff <a href="delete">x</a></div> 
    <div id="entry_2-02">stuff <a href="delete">x</a></div> 
</div> 

ссылка Удалить вызывает запрос Ajax и удаления запись после успешного вызова Ajax, запись div удаляется со страницы. Мой вопрос:

Как удалить группу, содержащую группу, как только все ее записи были удалены?

Надеюсь, что это достаточно подробный вопрос. Я чувствую, что это не ново, но два дня поиска ничего не привели.

ответ

5

Прежде чем удалить дочерний элемент, получите его родительский элемент, подсчитайте количество дочерних элементов, а затем, после удаления дочернего элемента, удалите родительский элемент, если число дочерних элементов равно нулю. Вот Quicky часть образца кода:

function d (x) 
{ 
    var e = document.getElementById(x); 
    var p = e.parentNode; 
    p.removeChild (e); 
    if (p.childNodes.length == 0) { 
     var pp = p.parentNode; 
     pp.removeChild (p); 
    } 
} 

Я добавил onclicks своим дивы, как это:

<div id="group_01"> 
    <div id="entry_1_01">stuff 11<a onclick="d('entry_1_01');" href="#delete">x</a></div> 
    <div id="entry_1_02">stuff 12<a onclick="d('entry_1_02');" href="#delete">x</a></div> 
</div> 

Я также изменил ссылку на «Удалять». Вы могли бы убрать это по-разному.

+0

Кто-то поднял интересный вопрос на комментарий, который они сделали. Работает ли chlidNodes для доктринов без XHTML? – thismat

+0

выглядит так: https://developer.mozilla.org/en/DOM:element.childNodes – thismat

+0

@thisismat: речь идет не о doctype, а о другой кросс-браузерной головной боли: http://stackoverflow.com/questions/281443/inconsistent-whitespace-text-nodes-in-internet-explorer В настоящее время этот ответ не работает как предполагаемый кросс-браузер из-за пробелов в показанной разметке. –

2

функция, как это должно будет работать:

function removeNodeIfEmpty(node) { 
    var container = document.getElementById(node); 
    var nodeCount = 0; 

    for (i = 0; i < container.childNodes.length, i++) { 
     if (container.childNodes[i].nodeType == 1) { 
      nodeCount += 1; 
     } 
    } 

    if (nodeCount < 1) { 
    container.parentNode.removeChild(node); 
    } 
} 

Это должно учитывать пробельный вопрос.

+0

Откуда берутся методы getChildNodes() 'и' getParent() '? Они не являются частью привязки ECMAScript спецификации DOM ... – NickFitz

+0

Функция getParent() была ошибкой, которая была исправлена, getChildNodes() Я не уверен, честно, но я использовал ее и протестировал ее в общих браузеров, и он работал нормально.Хорошо, однако, теперь мне любопытно, только это xhtml или нет. – thismat

+0

Да, getChildNodes тоже была ошибкой, я прошел через часть своего старого кода, где я делал то, что он пытался сделать, некоторое время. То, что мне действительно нужно (отредактировано), - http://www.w3schools.com/Dom/prop_element_childnodes.asp - интересно, это работает с элементами, если вы используете xhtml. – thismat

1

Предполагая, что вы делаете что-то вроде этого, чтобы удалить запись:

entryDiv.parentNode.removeChild(entryDiv); 

, то вы должны быть в состоянии использовать следующий код, чтобы удалить группу DIV, когда последний ребенок удаляется:

var groupDiv = entryDiv.parentNode; 
groupDiv.removeChild(entryDiv); 
if (!groupDiv.firstChild) { 
    groupDiv.parentNode.removeChild(groupDiv); 
} 

... хотя вам нужно следить за текстовыми узлами только в виде пробелов, если эти записи не были созданы напрямую скриптом.

Смежные вопросы