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
referenceNode
está el nodo que quieres ponernewNode
después? SireferenceNode
es el último hijo dentro de su elemento padre, está bien, porquereferenceNode.nextSibling
lo seránull
yinsertBefore
manejará 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
+outerHTML
Upsides:
insertBefore
(descanso incluso si el nombre de la variable de nodo existente es de 3 caracteres de largo)Desventajas:
outerHTML
convierte el elemento en una cadena. Lo necesitamos porqueinsertAdjacentHTML
agrega contenido de cadenas en lugar de elementos.fuente
.insertAdjacentElement()
Una búsqueda rápida en Google revela este script
fuente
targetElement.nextSibling
regresaránull
. Cuandonode.insertBefore
se llama connull
su 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
node1
ynode2
,node1.after(node2)
insertanode2
despué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
insertAfter
debería funcionar de manera similar a insertBefore . El siguiente código realizará lo siguiente:Node
se agrega el nuevoNode
,Node
se agrega el nuevoNode
después de la referenciaNode
,Node
se agrega el nuevoNode
tiene un hermano después, entonces el nuevoNode
se inserta antes de ese hermanoNode
Extensible
Node
Un 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óndeinsertBefore
se 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 seinsertBefore
inserta al final.Desde un nulo
referenceNode
requiere que ubique al padre, necesitamos conocer al padre -insertBefore
es 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
Node
prototipo: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
appendChild
funció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