¿Por qué removeChild() me impide utilizar appendChild() dentro de una función Javascript?
-
16-09-2019 - |
Pregunta
En este código, cuando llamo a la función cleanGrid(), mi objetivo era deshacerme del div que era de clase "círculo" y reemplazarlo con un div de clase "cuadrado".Por lo que realmente estoy usando este código, no son elementos reemplazables, por lo que replaceChild() no funcionaría.Si comento la llamada a la función cleanGrid(), el código funciona bien y el botón simplemente agrega un div con la clase 'cuadrado' para cada clic.Lo que realmente quiero que suceda es que cleanGrid() elimine lo que esté en el div 'cuadrícula' y deje espacio para lo que deba agregarse después de llamar a esta función, pero no se puede agregar nada después de llamar a esta función y estoy No estoy seguro de por qué.
<body>
<div id="grid"><div class="circle">hello</div></div>
<button onclick="addSquare()">add a Square</button>
<script language="JavaScript">
var g = {};
g.myGrid = document.getElementById("grid");
function addSquare() {
// Calling cleanGrid() is giving me problems.
// I want to wipe everything clean first and then add the divs of the 'square' class.
// But instead it just clears the 'grid' div and doesn't allow anything to be added.
cleanGrid(); // WHY NOT?
var newSquare = document.createElement("div");
newSquare.className = "square";
newSquare.innerHTML = "square";
g.myGrid.appendChild(newSquare);
}
function cleanGrid() {
var x = document.getElementById("grid");
while(x.childNodes) {
var o = x.lastChild;
x.removeChild(o);
}
}
</script>
</body>
Solución
No creo que su función cleanGrid
funcionará del modo que usted ha codificado él. x.childNodes
seguirá siendo Truthy incluso si está vacío (una NodeList
vacía no es Falsey-). Así que sospecho que es una excepción (en la llamada removeChild
) o sin fin de bucle, que (en ambos sentidos) es por otro código no se está ejecutando. Pruebe a ejecutar en un entorno de depuración (Firefox + Firebug, IE + Visual Studio o el kit de herramientas de desarrollador, lo que sea), donde se puede ver lo que está pasando.
Aquí hay un reelaboración fuera de la manga de cleanGrid
:
function cleanGrid() {
var x = document.getElementById("grid");
while (x.lastChild) {
x.removeChild(x.lastChild);
}
}
O, por supuesto:
function cleanGrid() {
document.getElementById("grid").innerHTML = "";
}
... ya innerHTML
, aunque no estándar, con el apoyo de todos los principales navegadores, y la mayor parte de los menores de edad.
Otros consejos
T.J.Crowder entendió la lógica detrás del comportamiento.
Sin embargo, esto funcionará:
function cleanGrid() {
var x = document.getElementById("grid");
var len =x.childNodes.length;
while(len) {
x.removeChild(x.lastChild);
--len;
}
}