Сложный обход Дом с использованием JavaScript

Код для 01.js:

var childp = document.getElementById('selected-plays').getElementsByTagName('li');
function getElementsRequired(childp) {
var listitem = [];
var i = 0;
for(i = 0 ; i <childp.length; i++){
//   console.log(childp[i].childNodes.length); 
//condition to filter leaf nodes which are 'li'.
if ((childp[i].childNodes.length - 1))

    listitem.push(childp[i]);
}
//Loop for removing li's which are not direct sibling of ul with class="selected-plays"
for(i =0 ; i<listitem.length; i++){
    if(listitem[i].childNodes[1].getElementsByTagName('a').length){
    console.log(listitem[i].childNodes[1].getElementsByTagName('a'));
    listitem.splice(i,1);
  }
}
return listitem;
}

в консоли:

 getElementsRequired(childp);

код для тела 01.html:

<body>
<h2>Selected Shakephere plays</h2>
<ul id="selected-plays">
    <li>Comedies
        <ul>
            <li><a href="/asyoulikeit/">As You Like It</a></li>
            <li>All's Well That Ends Well</li>
            <li>A Midsummer Night's Dream</li>
            <li>Twelfth Night</li>
        </ul>
    </li>
    <li>Tragedies
        <ul>
            <li><a href="hamlet.pdf">Hamlet</a></li>
            <li>Macbeth</li>
            <li>Romeo and Juliet</li>
        </ul>
    </li>
    <li>Histories
        <ul>
            <li>Henry IV (<a href="mailto:henryiv@king.co.uk">email</a>)
                <ul>
                    <li>Part I</li>
                    <li>Part II</li>
                </ul>
            </li>
            <li><a href="http://www.shakespeare.co.uk/henryv.htm">Henry V</a></li>
            <li>Richard II</li>
        </ul>
    </li>
</ul>
</body>

Элементы для выбора являются первыми 'li'siblings of class="selected-plays", Проблема в том, что обход dom дает больше блоков элементов, но он должен давать только 3 блока, а именно "Comedies","Tragedies","Histories", Как мне удалить лишний блок элементов, который № 4 и содержит Генри IV?

jsbin для этого здесь: http://jsbin.com/vital/2/edit

1 ответ

Вы можете использовать JQuery's $.clone() а также $.remove() чтобы сделать это проще. Clone предоставит вам новый элемент, чтобы вы не уничтожали HTML в своем DOM. Remove затем удалит дочерний UL из вновь клонированного LI.

http://jsbin.com/jeloloto/2/edit

$('button').on('click', function() {
  var $categoryLIs = $("#selected-plays").children("li");
  var categories = getCategories($categoryLIs);
  debugger;
})

var getCategories = function($elements) {
  var categories = new Array();

  $elements.each(function(index) {
    var element = $elements[index];
    var newElement = $.clone(element);
    $(newElement).find('ul').remove();
    categories.push(newElement);
  });

  return categories;
}
Другие вопросы по тегам