Existe insertBefore()
em JavaScript, mas como posso inserir um elemento após outro sem usar o jQuery ou outra biblioteca?
javascript
dom
insert
append
Xah Lee
fonte
fonte
Respostas:
Onde
referenceNode
está o nó que você deseja colocarnewNode
depois. SereferenceNode
é o último filho dentro de seu elemento pai, tudo bem, porquereferenceNode.nextSibling
seránull
einsertBefore
lida com esse caso, adicionando ao final da lista.Assim:
Você pode testá-lo usando o seguinte snippet:
fonte
insertBefore()
trabalha com nós de texto. Por que você querinsertAfter()
ser diferente? Você deve criar um par separado de funções nomeadasinsertBeforeElement()
einsertAfterElement()
para isso.O JavaScript simples seria o seguinte:
Anexar antes:
Anexar após:
Mas, jogue alguns protótipos para facilitar o uso
Ao criar os seguintes protótipos, você poderá chamar essas funções diretamente dos elementos recém-criados.
newElement.appendBefore(element);
newElement.appendAfter(element);
.appendBefore (elemento) Protótipo
Protótipo .appendAfter (elemento)
E, para ver tudo em ação, execute o seguinte snippet de código
Mostrar snippet de código
Execute-o no JSFiddle
fonte
existingElement.appendAfter(newElement);
. Veja o que quero dizer neste jsfiddle atualizado .insertAdjacentHTML
+outerHTML
De cabeça para baixo:
insertBefore
(quebra mesmo se o nome da variável do nó existente tiver 3 caracteres)Desvantagens:
outerHTML
converte o elemento em uma sequência. Precisamos disso porqueinsertAdjacentHTML
adiciona conteúdo de strings em vez de elementos.fonte
.insertAdjacentElement()
Uma rápida pesquisa no Google revela esse script
fonte
targetElement.nextSibling
retornaránull
. Quandonode.insertBefore
é chamado comnull
o segundo argumento, ele adiciona o nó no final da coleção. Em outras palavras, oif(parent.lastchild == targetElement) {
ramo é supérfluo, porqueparent.insertBefore(newElement, targetElement.nextSibling);
lidará adequadamente com todos os casos, mesmo que pareça de outra forma à primeira vista. Muitos já apontaram isso em outros comentários.Embora
insertBefore()
(consulte MDN ) seja ótimo e faça referência à maioria das respostas aqui. Para maior flexibilidade e para ser um pouco mais explícito, você pode usar:insertAdjacentElement()
(consulte MDN ) Permite fazer referência a qualquer elemento e inserir o elemento a ser movido exatamente para onde você deseja:Outros a serem considerados para casos de uso semelhantes:
insertAdjacentHTML()
einsertAdjacentText()
Referências:
https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentElement https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML https: // developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentText
fonte
O método
node.after
( doc ) insere um nó após outro nó.Para dois nós DOM
node1
enode2
,node1.after(node2)
inserenode2
depoisnode1
.Esse método não está disponível em navegadores mais antigos; portanto, geralmente é necessário um polyfill.
fonte
Solução 2018 (más práticas, consulte 2020)
Eu sei que essa pergunta é antiga, mas para qualquer usuário futuro, aqui está um protótipo modificado, este é apenas um micro-preenchimento para a função .insertAfter que não existe, esse protótipo adiciona diretamente uma nova função
baseElement.insertAfter(element);
ao protótipo Element:Depois de colocar o polyfill em uma biblioteca, essência ou apenas no seu código (ou em qualquer outro lugar onde ele possa ser referenciado), basta escrever
document.getElementById('foo').insertAfter(document.createElement('bar'));
Solução de 2019 (Feio, vá para 2020)
Nova edição: você não deve usar protótipos. Eles substituem a base de código padrão e não são muito eficientes ou seguros e podem causar erros de compatibilidade, mas se for para projetos não comerciais, isso não deve importar. Se você deseja uma função segura para uso comercial, basta usar uma função padrão. não é bonito, mas funciona:
Solução 2020
Padrões da Web atuais para ChildNode: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode
Está atualmente nos padrões vivos e é SEGURO.
Para navegadores não suportados, use este Polyfill: https://github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js
Alguém mencionou que o Polyfill usa Protos, quando eu disse que eram más práticas. Eles são, especialmente quando usados incorretamente, como minha solução para 2018. No entanto, esse polyfill está na documentação do MDN e usa um tipo de inicialização e execução mais segura. Além disso, é para suporte a navegadores mais antigos, nos dias em que a substituição de protótipo não era tão ruim.
Como usar a solução 2020:
fonte
Ou você pode simplesmente fazer:
fonte
fonte
O método insertBefore () é usado como
parentNode.insertBefore()
. Então, para imitar isso e criar um métodoparentNode.insertAfter()
, podemos escrever o seguinte código.Javascript
HTML
Observe que estender o DOM pode não ser a solução certa para você, conforme declarado neste artigo .
No entanto, este artigo foi escrito em 2010 e as coisas podem ser diferentes agora. Então, decida por si próprio.
Método JavaScript insertAfter () DOM @ jsfiddle.net
fonte
Idealmente,
insertAfter
deve funcionar de forma semelhante ao insertBefore . O código abaixo fará o seguinte:Node
será anexadoNode
, o novoNode
será anexadoNode
após a referênciaNode
, o novoNode
será anexadoNode
tiver um irmão depois, o novoNode
será inserido antes desse irmãoNode
Estendendo
Node
Um exemplo comum
Veja o código em execução
Mostrar snippet de código
fonte
Eu sei que esta pergunta já tem muitas respostas, mas nenhuma delas atendeu exatamente aos meus requisitos.
Eu queria uma função que tivesse exatamente o comportamento oposto de
parentNode.insertBefore
- isto é, ela deve aceitar um nuloreferenceNode
(o qual a resposta aceita não) e ondeinsertBefore
seria inserida no final dos filhos, que esta deve ser inserida no início , pois caso contrário haverá ' d não há como inserir no local inicial com esta função; o mesmo motivo éinsertBefore
inserido no final.Como um nulo
referenceNode
exige que você localize o pai, precisamos conhecê-lo -insertBefore
é um método doparentNode
, para que ele tenha acesso ao pai dessa maneira; como nossa função não funciona, precisamos passar o pai como parâmetro.A função resultante é assim:
Ou (se você precisar, eu não recomendo), é claro que você pode aprimorar o
Node
protótipo:fonte
Este código é um trabalho para inserir um item de link logo após o último filho existente para incluir um pequeno arquivo css
fonte
Você pode usar
appendChild
função para inserir após um elemento.Referência: http://www.w3schools.com/jsref/met_node_appendchild.asp
fonte
uma implementação robusta do insertAfter.
};
fonte
Vamos lidar com todos os cenários
fonte
fonte
Você pode realmente usar um método chamado
after()
na versão mais recente do Chrome, Firefox e Opera. A desvantagem deste método é que o Internet Explorer ainda não o suporta.Exemplo:
Um código HTML simples para testar que é:
Como esperado, ele move o elemento para cima após o elemento para baixo
fonte