Existe insertBefore()en JavaScript, pero ¿cómo puedo insertar un elemento después de otro elemento sin usar jQuery u otra biblioteca?
javascript
dom
insert
append
Xah Lee
fuente
fuente

Respuestas:
¿Dónde
referenceNodeestá el nodo que quieres ponernewNodedespués? SireferenceNodees el último hijo dentro de su elemento padre, está bien, porquereferenceNode.nextSiblinglo seránullyinsertBeforemanejará ese caso al agregarlo al final de la lista.Entonces:
Puede probarlo con el siguiente fragmento:
fuente
insertBefore()trabaja con nodos de texto. ¿Por qué quieresinsertAfter()ser diferente? Debería crear un par separado de funciones con el nombreinsertBeforeElement()yinsertAfterElement()para eso.JavaScript directo sería el siguiente:
Añadir antes:
Añadir después:
Pero, arroje algunos prototipos allí para facilitar su uso
Al construir los siguientes prototipos, podrá llamar a estas funciones directamente desde los elementos recién creados.
newElement.appendBefore(element);newElement.appendAfter(element);.appendBefore (elemento) Prototipo
.appendAfter (elemento) Prototipo
Y, para verlo todo en acción, ejecute el siguiente fragmento de código
Mostrar fragmento de código
Ejecútalo en JSFiddle
fuente
existingElement.appendAfter(newElement);. Vea lo que quiero decir en este jsfiddle actualizado .insertAdjacentHTML+outerHTMLUpsides:
insertBefore(descanso incluso si el nombre de la variable de nodo existente es de 3 caracteres de largo)Desventajas:
outerHTMLconvierte el elemento en una cadena. Lo necesitamos porqueinsertAdjacentHTMLagrega contenido de cadenas en lugar de elementos.fuente
.insertAdjacentElement()Una búsqueda rápida en Google revela este script
fuente
targetElement.nextSiblingregresaránull. Cuandonode.insertBeforese llama connullsu segundo argumento, agregará el nodo al final de la colección. En otras palabras, laif(parent.lastchild == targetElement) {rama es superflua, porqueparent.insertBefore(newElement, targetElement.nextSibling);se ocupará adecuadamente de todos los casos, aunque al principio parezca lo contrario. Muchos ya lo han señalado en otros comentarios.Aunque
insertBefore()(ver MDN ) es excelente y se hace referencia en la mayoría de las respuestas aquí. Para mayor flexibilidad y para ser un poco más explícito, puede usar:insertAdjacentElement()(ver MDN ) Esto le permite hacer referencia a cualquier elemento e insertar el elemento a mover exactamente donde lo desee:Otros a tener en cuenta para casos de uso similares:
insertAdjacentHTML()yinsertAdjacentText()Referencias
https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdarestElement https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdarestHTML https: // developer.mozilla.org/en-US/docs/Web/API/Element/insertAdarestText
fuente
El método
node.after( doc ) inserta un nodo después de otro nodo.Para dos nodos DOM
node1ynode2,node1.after(node2)insertanode2despuésnode1.Este método no está disponible en navegadores antiguos, por lo que generalmente se necesita un polyfill.
fuente
Solución 2018 (mala práctica, ir a 2020)
Sé que esta pregunta es antigua, pero para cualquier usuario futuro, aquí hay un prototipo modificado, esto es solo un micro polyfill para la función .insertAfter que no existe, este prototipo agrega directamente una nueva función
baseElement.insertAfter(element);al prototipo Element:Una vez que haya colocado el polyfill en una biblioteca, gist, o simplemente en su código (o en cualquier otro lugar donde pueda ser referenciado) Simplemente escriba
document.getElementById('foo').insertAfter(document.createElement('bar'));Solución 2019 (feo, vaya a 2020)
Nueva edición: NO DEBE USAR LOS PROTOTIPOS. Sobrescriben la base de código predeterminada y no son muy eficientes o seguros y pueden causar errores de compatibilidad, pero si es para proyectos no comerciales, no debería importar. Si desea una función segura para uso comercial, utilice una función predeterminada. no es bonito pero funciona:
Solución 2020
Estándares web actuales para ChildNode: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode
Actualmente está en los estándares de vida y es SEGURO.
Para navegadores no compatibles, use este Polyfill: https://github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js
Alguien mencionó que Polyfill usa Protos, cuando dije que eran malas prácticas. Lo son, especialmente cuando se usan incorrectamente, como mi solución para 2018. Sin embargo, ese polyfill está en la documentación de MDN y usa un tipo de inicialización y ejecución que es más seguro. Además, ES para soporte de navegador antiguo, en la época en que la sobrescritura de prototipos no era tan mala.
Cómo usar la Solución 2020:
fuente
O simplemente puedes hacer:
fuente
fuente
El método insertBefore () se usa como
parentNode.insertBefore(). Entonces, para imitar esto y hacer un métodoparentNode.insertAfter(), podemos escribir el siguiente código.JavaScript
HTML
Tenga en cuenta que extender el DOM podría no ser la solución adecuada para usted, como se indica en este artículo .
Sin embargo, este artículo fue escrito en 2010 y las cosas pueden ser diferentes ahora. Así que decide por tu cuenta.
Método de JavaScript DOM insertAfter () @ jsfiddle.net
fuente
Idealmente
insertAfterdebería funcionar de manera similar a insertBefore . El siguiente código realizará lo siguiente:Nodese agrega el nuevoNode,Nodese agrega el nuevoNodedespués de la referenciaNode,Nodese agrega el nuevoNodetiene un hermano después, entonces el nuevoNodese inserta antes de ese hermanoNodeExtensible
NodeUn ejemplo común
Ver el código en ejecución
Mostrar fragmento de código
fuente
Sé que esta pregunta ya tiene demasiadas respuestas, pero ninguna de ellas cumplió con mis requisitos exactos.
Quería una función que tenga el comportamiento exactamente opuesto de
parentNode.insertBefore, es decir, debe aceptar un valor nuloreferenceNode(que la respuesta aceptada no acepta ) y dóndeinsertBeforese insertaría al final de los hijos, este debe insertar al principio , ya que de lo contrario allí ' d no hay forma de insertar en la ubicación de inicio con esta función en absoluto; la misma razón seinsertBeforeinserta al final.Desde un nulo
referenceNoderequiere que ubique al padre, necesitamos conocer al padre -insertBeforees un método deparentNode, por lo que tiene acceso al padre de esa manera; nuestra función no lo hace, por lo que tendremos que pasar el padre como parámetro.La función resultante se ve así:
O (si es necesario, no lo recomiendo), por supuesto, puede mejorar el
Nodeprototipo:fuente
Este código es un trabajo para insertar un elemento de enlace justo después del último elemento secundario existente para incluir un pequeño archivo css
fuente
Puedes usar
appendChildfunción para insertar después de un elemento.Referencia: http://www.w3schools.com/jsref/met_node_appendchild.asp
fuente
Una implementación robusta de insertAfter.
};
fuente
Vamos a manejar todos los escenarios
fuente
fuente
En realidad, puede utilizar un método llamado
after()en la versión más reciente de Chrome, Firefox y Opera. La desventaja de este método es que Internet Explorer aún no lo admite.Ejemplo:
Un código HTML simple para probar que es:
Como se esperaba, mueve el elemento hacia arriba después del elemento hacia abajo
fuente