Digamos:
<div>
pre text
<div class="remove-just-this">
<p>child foo</p>
<p>child bar</p>
nested text
</div>
post text
</div>
para isso:
<div>
pre text
<p>child foo</p>
<p>child bar</p>
nested text
post text
</div>
Eu tenho descoberto usando Mootools, jQuery e até mesmo JavaScript (bruto), mas não conseguia ter a ideia de como fazer isso.
javascript
dom
Cheeaun
fonte
fonte
$('.remove-just-this').replaceWith(function() { return $(this).html(); });
O método independente da biblioteca é inserir todos os nós filhos do elemento a ser removido antes de si mesmo (o que os remove implicitamente de sua posição anterior), antes de removê-lo:
Isso moverá todos os nós filhos para o local correto na ordem certa.
fonte
node.replaceWith(...node.childNodes);
Você deve certificar-se de fazer isso com o DOM, não
innerHTML
(e se estiver usando a solução jQuery fornecida por jk, certifique-se de que ela mova os nós DOM em vez de usarinnerHTML
internamente), a fim de preservar coisas como tratadores de evento.Minha resposta é muito parecida com a do insin, mas terá um desempenho melhor para estruturas grandes (anexar cada nó separadamente pode ser desgastante em redesenhos onde o CSS deve ser reaplicado para cada um
appendChild
; com umDocumentFragment
, isso ocorre apenas uma vez, pois não é visível até depois de seu os filhos são todos anexados e adicionados ao documento).fonte
fonte
Maneira mais elegante é
fonte
Use JS moderno!
oldNode.replaceWith(newNode)
é ES5 válido...array
é o operador de propagação, passando cada elemento da matriz como um parâmetrofonte
Qualquer que seja a biblioteca que você esteja usando, é necessário clonar o div interno antes de remover o div externo do DOM. Em seguida, você deve adicionar o div interno clonado ao local no DOM onde estava o div externo. Portanto, as etapas são:
innerHTML
da div interna em uma variável ou você pode copiar a árvore interna recursivamente nó por nó.removeChild
o pai do div externo com o div externo como argumento.Algumas bibliotecas farão parte ou tudo isso por você, mas algo como o descrito acima estará acontecendo nos bastidores.
fonte
E, como você também tentou no mootools, aqui está a solução no mootools.
Observe que isso é totalmente não testado, mas já trabalhei com mootools antes e deve funcionar.
http://mootools.net/docs/Element/Element#Element:getChildren
http://mootools.net/docs/Element/Element#Element:replaces
fonte
Substitua div pelo seu conteúdo:
fonte
se quiser fazer a mesma coisa de pijama, veja como. funciona muito bem (obrigado à pálpebra). Consegui fazer um editor de rich text adequado que cria estilos corretamente sem bagunçar, graças a isso.
fonte
pyjamas
.Eu estava procurando a melhor resposta em termos de desempenho ao trabalhar em um DOM importante.
A resposta do eyelidlessness foi apontando que usando javascript as performances seriam melhores.
Fiz os seguintes testes de tempo de execução em 5.000 linhas e 400.000 caracteres com uma composição DOM complexa dentro da seção a ser removida. Estou usando um ID em vez de uma classe por uma razão conveniente ao usar javascript.
Usando $ .unwrap ()
Usando $ .replaceWith ()
Usando DocumentFragment em javascript
Conclusão
Em termos de desempenho, mesmo em uma estrutura DOM relativamente grande, a diferença entre o uso de jQuery e javascript não é enorme. Surpreendentemente,
$.unwrap()
é mais caro do que$.replaceWith()
. Os testes foram feitos com jQuery 1.12.4.fonte
Se você estiver lidando com várias linhas, como foi no meu caso de uso, provavelmente será melhor usar algo como:
fonte