0

I am trying to remove all the elements from my page with a specific class name, but for some reason only the alternate class gets deleted.

The code pen link is here https://codepen.io/miller619/pen/WoVpdE

function prev(e) {
    'use strict';
    e.preventDefault();
    var getID = document.getElementById("zone");
    var removeXButtons = getID.getElementsByClassName("xbutton");
    for (var i = 0; i < removeXButtons.length; i++) {
        removeXButtons[i].parentNode.removeChild(removeXButtons[i]);
    }

}
<div id="zone">
  <input class="xbutton" name="xbtn" type="button" value="&times;">
  <input class="xbutton" name="xbtn" type="button" value="&times;">
  <input class="xbutton" name="xbtn" type="button" value="&times;">
</div>
<div id="pbtn" > <a href="#" class="btn btn-info btn-preview" onclick="prev(event)"><span class="glyphicon glyphicon-eye-open"></span> Delete all</a> </div>

Where am I going wrong?

4
  • Loop backwards instead of forwards. When you remove an element, the loop index of every element after it changes. Commented Jan 14, 2017 at 6:10
  • Because once you remove a child, the index of the remaining children also changes on each iteration. Commented Jan 14, 2017 at 6:12
  • Possible duplicate of Removing HTMLCollection elements from the DOM Commented Jan 14, 2017 at 6:15
  • looping backwards made it work.. thanks a lot everyone.... Commented Jan 14, 2017 at 6:17

1 Answer 1

2

Just change the order of for loop and it'll work. Problem is as you remove an element from array, the order of element changes. Traversing the array backwards wont give you this problem.

function prev(e) {
    'use strict';
    e.preventDefault();
    var getID = document.getElementById("zone");
    var removeXButtons = getID.getElementsByClassName("xbutton");
    for (var i = removeXButtons.length-1; i >=0 ; i--) {
        removeXButtons[i].parentNode.removeChild(removeXButtons[i]);
    }
} 
}

If you want to loop forwards you can do this,

function prev(e) {
        'use strict';
        e.preventDefault();
        var getID = document.getElementById("zone");
        var removeXButtons = getID.getElementsByClassName("xbutton");
        for (var i = 0; i < removeXButtons.length-1 ; i++) {
            removeXButtons[i].parentNode.removeChild(removeXButtons[i]);
            i--;
        }
    } 
    }
Sign up to request clarification or add additional context in comments.

1 Comment

while(removeXButtons.length) removeXButtons[0].parentNode.removeChild(removeXButtons[0]);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.