si quieres remover todos los elementos de otro elemento, es cuestion de recorrerlo mediante la comprobacion de la existencias de elementos. puedes hacerlo con cualquiera de las siguientes propiedades o funcion: childNodes.length, firstChild, lastChild, o hasChildNodes(). la forma menos complicada,
Código:
// siendo element la referencia al elemento que se desea vaciar;
while(element.firstChild) element.removeChild(element.firstChild);
// el bucle esta controlado por la existencia de un primer elemento hijo;
por otro lado, si solo quieres eliminar unos elementos especificos, por ejemplo todos los elementos SPAN, captura todos los SPAN y en el ciclo siempre apuntas al primer indece de la coleccion, sin la necesidad de un iterador porque de lo contrario te sucede lo que estas experimentando.
Código:
var spans = element.getElementsByTagName("span");
while(spans.length) spans[0].parentNode.removeChild(spans[0]);
// el bucle esta controlado por la longitud de la coleccion;
¿a que se debe el error? getElementsByTagName, al igual que otras propiedades y funciones del DOM, devuelven un objeto tipo HTMLCollection. este objeto es activo, de modo que la longitud de la coleccion va cambiando a la vez que se desplazan o eliminan [y creo que tambien cuando se agregan nuevos elementos] los elementos de la coleccion. debido a esta transformacion, un iterador numerico no apunta a todos los indice de la coleccion, dejando asi una cantidad de elementos sin tocar.
@edit,
ciertamente como dice caricatos, ese error no es exclusivo de las colecciones. tambien sucede con los arrays si los manipulas con push y pop, entre otras funciones.