Como definir o elemento DOM como o primeiro filho?

243

Eu tenho o elemento E e estou anexando alguns elementos a ele. De repente, descubro que o próximo elemento deve ser o primeiro filho de E. Qual é o truque, como fazê-lo? Desvio de método não funciona porque E é um objeto, não uma matriz.

O caminho longo seria percorrer os filhos de E e movê-los com a chave ++, mas tenho certeza de que existe um caminho mais bonito.

Popara
fonte
1
Vocês são rápidos! Sinto muito, acho que fui mal interpretado. elemento e | - child-el_1 | - child-el_2 | - child-el_3 E então vem child-el_4 ... que precisa ser adequado como primeiro filho. prepend colocaria child-el_4 antes de [b] e [/ b], estou errado e cansado ou o quê?
Popara

Respostas:

472
var eElement; // some E DOM instance
var newFirstElement; //element which should be first in E

eElement.insertBefore(newFirstElement, eElement.firstChild);
nemisj
fonte
3
Você meu amigo, acabou de ser um urso! Achado extra útil. docs.jquery.com/Manipulation/insertBefore
Popara
79
Para informações, se não houver elemento no pai, o filho será adicionado de qualquer maneira.
Knu
No caso de firstChild, o nó de texto lança uma exceção. mas jquery prepend não.
Sergey Sahakyan
3
@ Emery, funciona para mim também com nó de texto, testado no Firefox e Chromium. Qual navegador você usou? Tem certeza de que o problema não estava do seu lado? Você gostaria de preparar um snippet / jsfiddle que reproduza o problema?
user
list.outerHTML = entry.outerHTML + list.outerHTML; A esperança ajuda alguém.
Deniz Porsuk # 21/18
106

2017 version

Você pode usar

targetElement.insertAdjacentElement('afterbegin', newFirstElement)

Do MDN :

O método insertAdjacentElement () insere um determinado nó do elemento em uma determinada posição em relação ao elemento em que é chamado.

position
Um DOMString representando a posição relativa ao elemento; deve ser uma das seguintes seqüências de caracteres
beforebegin:: Antes do próprio elemento.
afterbegin: Logo dentro do elemento, antes de seu primeiro filho.
beforeend: Apenas dentro do elemento, após seu último filho.
afterend: Após o próprio elemento.

elemento
O elemento a ser inserido na árvore.

Também na família de insertAdjacentexistem os métodos irmãos:

element.insertAdjacentHTML('afterbegin','htmlText')para injetar diretamente a string html, como innerHTMLmas sem substituir tudo, para que você possa pular o processo opressivo document.createElemente até criar o componente inteiro com o processo de manipulação da string

element.insertAdjacentTextpara injetar higienizar a string no elemento. não maisencode/decode

pery mimon
fonte
2
ótima sugestão, mas por que "voltar a 2017", esse é um método padrão mesmo no ie8 #
Vitaliy Terziev 18/17
obrigado. e outro obrigado pela sua compreensão. título é para ajudar as pessoas a distinguir rapidamente que é nova resposta
pery mimon
E se element = document.importNode (documentfragment, true)?
Martin Meeser
que o retorno elementtypeof document-fragmentque não tem insertAdjacent...(). até que tenhamos uma resposta melhor, seu melhor palpite é anexar a fragmenta div. fazer a sua manipulação dom e, em seguida, usar Range.selectNodeContents()e Range.extractContents()voltar um fragmento
pery mimon
onde 'elemento' é o elemento em que você deseja adicionar, e 'elemento' é o elemento que deseja adicionar;)
Bokkie
95

Versão 2018

parentElement.prepend(newFirstChild)

Este é o JS moderno! É mais legível que as opções anteriores. Atualmente, está disponível no Chrome, FF e Opera.

PS Você pode anexar cordas diretamente

parentElement.prepend('This text!')

developer.mozilla.org

Posso usar - 94% maio de 2020

Polyfill

Gibolt
fonte
6
Ótima solução, obrigado! Isso me irrita que eles decidiram adicionar uma criança até o fim é .appendChild(), mas adicionando-o ao início é .prepend(), em vez de furar a convenção e chamando-o.prependChild()
Marquizzo
1
append()existe também, funciona da mesma maneira que prepend(), mas no final
Gibolt
1
Também fiquei confuso quando vi essas perguntas perguntando sobre a implementação, prependenquanto descobri que já é isso. :( Ok, não existia no passado.
Rick
10

Você pode implementá-lo diretamente em todos os seus elementos html na janela.
Como isso :

HTMLElement.prototype.appendFirst=function(childNode){
    if(this.firstChild)this.insertBefore(childNode,this.firstChild);
    else this.appendChild(childNode);
};
yorg
fonte
prependé o equivalente a baunilha JS, sem a necessidade de um protótipo. Será padrão em ES7, e você deve usar, se possível, para a sua aplicação
Gibolt
6

Resposta aceita refatorada em uma função:

function prependChild(parentEle, newFirstChildEle) {
    parentEle.insertBefore(newFirstChildEle, parentEle.firstChild)
}
Joseph Dykstra
fonte
+1 por usar o relacionamento pai-filho. A resposta aceita não tem isso. Eu preciso saber o eElementque faz sentido. E para isso, preciso ler a pergunta. Na maioria das vezes, apenas verifico o título e vou diretamente para a resposta, ignorando os detalhes da pergunta.
akinuri
4

A menos que eu tenha entendido errado:

$("e").prepend("<yourelem>Text</yourelem>");

Ou

$("<yourelem>Text</yourelem>").prependTo("e");

Embora pareça na sua descrição que haja alguma condição anexada,

if (SomeCondition){
    $("e").prepend("<yourelem>Text</yourelem>");
}
else{
    $("e").append("<yourelem>Text</yourelem>");
}
James Wiseman
fonte
+1 para a versão $! Estou escrevendo uma função de extensão do jQuery, então usarei a versão nativa sempre que possível por razões de desempenho, mas isso é perfeito!
Taylor Evanson
Na, ele está procurando JavaScript, não jquery.
vinyll
2

Eu acho que você está procurando a função .prepend no jQuery. Código de exemplo:

$("#E").prepend("<p>Code goes here, yo!</p>");
Emil Vikström
fonte
Vocês são rápidos! Sinto muito, acho que fui mal interpretado. elemento e | - child-el_1 | - child-el_2 | - child-el_3 E então vem child-el_4 ... que precisa ser adequado como primeiro filho. prepend colocaria child-el_4 antes de [b] e [/ b], estou errado e cansado ou o quê?
Popara
0

Eu criei esse protótipo para adicionar elementos ao elemento pai.

Node.prototype.prependChild = function (child: Node) {
    this.insertBefore(child, this.firstChild);
    return this;
};
Raza
fonte
0
var newItem = document.createElement("LI");       // Create a <li> node
var textnode = document.createTextNode("Water");  // Create a text node
newItem.appendChild(textnode);                    // Append the text to <li>

var list = document.getElementById("myList");    // Get the <ul> element to insert a new node
list.insertBefore(newItem, list.childNodes[0]);  // Insert <li> before the first child of <ul>

https://www.w3schools.com/jsref/met_node_insertbefore.asp

Ilker Cat
fonte