Command Palette

Search for a command to run...

replaceWith y replaceChild: Reemplazar Elementos

Domina replaceWith y replaceChild para sustituir elementos dinámicamente. Aprende múltiples nodos, event listeners, casos de uso y errores comunes.

Lectura: 11 min
Nivel: Principiante

TL;DR - Resumen rápido

  • replaceWith() es el método moderno: el elemento se reemplaza a sí mismo.
  • replaceChild() requiere acceso al padre y devuelve el nodo reemplazado.
  • replaceWith() acepta múltiples argumentos: nodos, strings, o mezclas.
  • Los event listeners del nodo reemplazado se pierden automáticamente.
  • Ideal para transformaciones de UI: texto a input, placeholder a contenido real.
  • Más eficiente que ocultar/mostrar con CSS cuando el elemento no se reutiliza.

Sustitución en el DOM

A menudo necesitamos cambiar el tipo de elemento, no solo su contenido o estilo. Ejemplos: convertir texto en input para editar, reemplazar un placeholder por contenido real, o transformar un botón en un spinner de carga.

El DOM ofrece dos métodos: replaceWith() (moderno) y replaceChild() (clásico). Ambos eliminan un elemento e insertan otro en su lugar, pero con sintaxis y capacidades diferentes.

replaceWith(): La Evolución

replaceWith() permite que un elemento se reemplace a sí mismo. Sintácticamente similar a remove(), pero inserta algo en su lugar.

replaceWith-modern.js
Loading code...

No necesitas acceder al padre - el elemento sabe su posición y se sustituye automáticamente. Retorna undefined, no el nodo reemplazado.

  • <strong>Sintaxis simple</strong>: <code>elemento.replaceWith(nuevo)</code> - directo e intuitivo
  • <strong>Sin referencia al padre</strong>: No necesitas <code>parentNode</code> como en métodos clásicos
  • <strong>Acepta múltiples argumentos</strong>: Puedes pasar varios nodos y strings a la vez
  • <strong>Nunca falla</strong>: Si el elemento no tiene padre, simplemente no hace nada

Compatibilidad Moderna

replaceWith() está soportado en todos los navegadores modernos. Para IE11, necesitarías un polyfill o usar replaceChild().

replaceChild(): La Forma Clásica

replaceChild() funciona desde el padre: parent.replaceChild(nuevo, viejo). Requiere tres referencias: padre, hijo nuevo, hijo viejo.

replaceChild-legacy.js
Loading code...

El orden de argumentos es contra-intuitivo: nuevo primero, viejo segundo. Devuelve el nodo reemplazado, útil si necesitas insertarlo en otro lugar.

Diferencia Clave

replaceChild devuelve el nodo reemplazado; replaceWith devuelve undefined. Si necesitas la referencia con replaceWith, guárdala antes de reemplazar.

Reemplazar con Múltiples Nodos

Una ventaja de replaceWith() es que acepta múltiples argumentos: nodos DOM, strings de texto, o mezclas. El elemento se reemplaza con todos ellos en orden.

multiple-nodes-replace.js
Loading code...

Esto es útil cuando un placeholder se expande en estructura compleja, o cuando necesitas insertar texto y elementos juntos. Con replaceChild() necesitarías múltiples operaciones.

Casos de Uso Prácticos

Reemplazar elementos es común en interfaces interactivas. Veamos los patrones más útiles.

Edit-in-Place

Patrón clásico: convertir texto en input al hacer click, permitiendo edición inline sin modales ni páginas separadas.

input-transformation.js
Loading code...

Este patrón mantiene el DOM limpio: solo existe el elemento necesario en cada momento. Más eficiente que tener ambos (texto e input) y alternar visibilidad con CSS.

Placeholder a Contenido Real

Otro caso común: reemplazar un skeleton o spinner por el contenido real cuando llega la data del servidor.

placeholder-to-content.js
Loading code...
  • <strong>Edit-in-place</strong>: Convierte elementos readonly en editables al interactuar
  • <strong>Lazy loading</strong>: Reemplaza placeholders por contenido real al cargar
  • <strong>Estados de UI</strong>: Transforma botones en spinners durante operaciones async
  • <strong>Respuestas condicionales</strong>: Muestra diferentes elementos según resultado de operación

Event Listeners al Reemplazar

Cuando reemplazas un elemento, todos sus event listeners se pierden porque el elemento es eliminado del DOM. Si el nuevo elemento necesita eventos, debes agregarlos manualmente.

event-listeners-replace.js
Loading code...

Alternativamente, usa delegación de eventos en un ancestro que no se reemplaza. Así los eventos funcionan automáticamente con cualquier elemento descendiente, reemplazado o no.

Delegación de Eventos

Para elementos que se reemplazan frecuentemente, usa delegación de eventos en el padre. Un solo listener captura eventos de todos los descendientes, sin importar si fueron reemplazados.

Errores Comunes

Estos son los errores más frecuentes al reemplazar elementos.

Error 1: Olvidar que pierdes event listeners

El elemento nuevo no hereda los listeners del viejo. Debes reasignarlos o usar delegación de eventos.

listener-error.js
Loading code...

Error 2: Perder la referencia al elemento

Después de replaceWith(), la variable original sigue apuntando al elemento viejo (ya no en el DOM). Si quieres trabajar con el nuevo, guarda su referencia.

reference-error.js
Loading code...

Referencias Obsoletas

Después de reemplazar, la variable original apunta al elemento desconectado. Si necesitas el nuevo elemento, guarda su referencia antes de replaceWith() o selecciónalo de nuevo con querySelector.

Resumen: Reemplazo de Elementos

Conceptos Principales:

  • replaceWith() es moderno: el elemento se reemplaza a sí mismo
  • replaceChild() es clásico: requiere padre y devuelve nodo viejo
  • replaceWith() acepta múltiples argumentos (nodos + strings)
  • Event listeners se pierden al reemplazar el elemento
  • Más eficiente que ocultar/mostrar con CSS cuando no se reutiliza

Mejores Prácticas:

  • Usa replaceWith() en código nuevo por sintaxis más clara
  • Guarda referencia del nuevo elemento antes de replaceWith()
  • Usa delegación de eventos para elementos que se reemplazan
  • Da focus() al nuevo elemento si es interactivo (inputs)
  • Prefiere reemplazar sobre ocultar cuando no se reutiliza el elemento