Digamos:
<div>
pre text
<div class="remove-just-this">
<p>child foo</p>
<p>child bar</p>
nested text
</div>
post text
</div>
a esto:
<div>
pre text
<p>child foo</p>
<p>child bar</p>
nested text
post text
</div>
He estado descubriendo el uso de Mootools, jQuery e incluso JavaScript (sin formato), pero no podía tener la idea de cómo hacerlo.
javascript
dom
cheeaun
fuente
fuente
$('.remove-just-this').replaceWith(function() { return $(this).html(); });
El método independiente de la biblioteca consiste en insertar todos los nodos secundarios del elemento que se eliminará antes que él mismo (lo que los elimina implícitamente de su posición anterior), antes de eliminarlo:
Esto moverá todos los nodos secundarios al lugar correcto en el orden correcto.
fuente
node.replaceWith(...node.childNodes);
Debe asegurarse de hacer esto con el DOM, no
innerHTML
(y si usa la solución jQuery proporcionada por jk, asegúrese de que mueva los nodos DOM en lugar de usarlosinnerHTML
internamente), para preservar cosas como los controladores de eventos.Mi respuesta es muy parecida a la de insin, pero funcionará mejor para estructuras grandes (agregar cada nodo por separado puede ser gravoso en los redibujos donde CSS debe volver a aplicarse para cada uno
appendChild
; con aDocumentFragment
, esto solo ocurre una vez, ya que no se hace visible hasta después de su los niños se adjuntan y se agregan al documento).fuente
fuente
Una forma más elegante es
fuente
¡Utilice JS moderno!
oldNode.replaceWith(newNode)
es válido ES5...array
es el operador de propagación, pasando cada elemento de la matriz como parámetrofuente
Cualquiera que sea la biblioteca que esté utilizando, debe clonar el div interno antes de eliminar el div externo del DOM. Luego, debe agregar el div interno clonado al lugar en el DOM donde estaba el div externo. Entonces los pasos son:
innerHTML
div interno en una variable o puede copiar el árbol interno recursivamente nodo por nodo.removeChild
al padre del div externo con el div externo como argumento.Algunas bibliotecas harán algo o todo esto por usted, pero algo como lo anterior estará sucediendo bajo el capó.
fuente
Y, dado que también probó en mootools, aquí está la solución en mootools.
Tenga en cuenta que eso no se ha probado en absoluto, pero he trabajado con mootools antes y debería funcionar.
http://mootools.net/docs/Element/Element#Element:getChildren
http://mootools.net/docs/Element/Element#Element:replaces
fuente
Reemplaza div con su contenido:
fuente
Si desea hacer lo mismo en pijama, así es como se hace. funciona muy bien (gracias a los párpados). Gracias a esto, he podido crear un editor de texto enriquecido adecuado que hace estilos correctamente sin estropear.
fuente
pyjamas
.Estaba buscando la mejor respuesta en términos de rendimiento mientras trabajaba en un DOM importante.
La respuesta de eyelidlessness fue señalar que con javascript el rendimiento sería el mejor.
Hice las siguientes pruebas de tiempo de ejecución en 5,000 líneas y 400,000 caracteres con una composición DOM compleja dentro de la sección para eliminar. Estoy usando una ID en lugar de una clase por una razón conveniente cuando uso javascript.
Usando $ .unwrap ()
Usando $ .replaceWith ()
Usando DocumentFragment en javascript
Conclusión
En cuanto al rendimiento, incluso en una estructura DOM relativamente grande, la diferencia entre usar jQuery y javascript no es enorme. Sorprendentemente
$.unwrap()
es más costoso que$.replaceWith()
. Las pruebas se han realizado con jQuery 1.12.4.fuente
Si está tratando con varias filas, como fue en mi caso de uso, probablemente sea mejor con algo como esto:
fuente