Lo más fácil para hacer debug es utilizar alert() para saber qué ocurre en cada momento.
Lo que está pasando es que al borrar un hijo, la longitud de
lista.childNodes.length varía. Entonces lo que hay que hacer es borrar un hijo, y no sumar ninguna unidad a
i (o restarla para luego sumarla). Porque lo que tiene que hacer es mirar el hijo con el mismo
i, que será diferente hijo en este caso.
En los demás navegadores funciona "bien" porque implementan bien el modelo de objetos DOM y los nodos de texto (tanto vacíos como no) los interpretan como nodos, IE se los come, ni los lee. Para IE tenemos 5 hijos, pero para FF he visto 12...
En fin, tu código completo quedaría así, aunque te recomiendo comprobar la propiedad de los nodos
nodeType, y mirar si no vale 1. 1 equivale a nodo de texto.
Código PHP:
<head>
<html>
<title>Untitled Document</title>
</head>
<div id="cont">
<div id="a" class="nudso">texto1</div>
<div id="b" class="nudso">texto2</div>
<div id="c" class="nudso">texto3</div>
<div id="d" class="nudso">texto4</div>
<div id="e" class="nudo">texto5</div>
</div>
<script type="text/javascript">
function borrar(){
var lista = document.getElementById("cont");
var i = 0;
alert("hay "+lista.childNodes.length+" hijos");
while(i < lista.childNodes.length ) {
alert( i+".className = "+lista.childNodes[i].className);
if(lista.childNodes[i].className != "nudo") {
if(lista.childNodes[i].nodeName == "DIV") {
lista.removeChild(lista.childNodes[i]);
i--;
}
}
i++;
}
}
window.onload = borrar;
</script>
</body>
</html>
Un saludo.