¿Cómo configurar el elemento DOM como primer hijo?


243

Tengo el elemento E y le agrego algunos elementos. De repente, descubro que el siguiente elemento debería ser el primer hijo de E. ¿Cuál es el truco, cómo hacerlo? El método unshift no funciona porque E es un objeto, no una matriz.

Un largo camino sería iterar a través de los hijos de E y moverlos con la tecla ++, pero estoy seguro de que hay una forma más bonita.


1
¡Ustedes son rápidos! Lo siento, creo que me malinterpretaron. elemento e | - child-el_1 | - child-el_2 | - child-el_3 Y luego viene child-el_4 ... que debe ajustarse como primer hijo. prepend pondría child-el_4 antes de [b] e [/ b], ¿estoy equivocado y cansado o qué?
Popara

Respuestas:


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

eElement.insertBefore(newFirstElement, eElement.firstChild);

3
¡Tú, mi amigo, acabas de hacerte un oso! Útil hallazgo extra. docs.jquery.com/Manipulation/insertBefore
Popara

79
Para obtener información si no hay ningún elemento en el padre, el hijo se agregará de todos modos.
Knu

En el caso de firstChild, el nodo de texto arroja una excepción. pero jquery prefieren no.
Sergey Sahakyan

3
@Sergey, también funciona para mí con el nodo de texto, probado en Firefox y Chromium. ¿Qué navegador usaste? ¿Estás seguro de que el problema no estaba de tu lado? ¿Le gustaría preparar un fragmento / jsfiddle que reproduzca el problema?
usuario

list.outerHTML = entry.outerHTML + list.outerHTML; La esperanza ayuda a alguien.
Deniz Porsuk

106

Versión 2017

Puedes usar

targetElement.insertAdjacentElement('afterbegin', newFirstElement)

De MDN :

El método insertAdarestElement () inserta un nodo de elemento dado en una posición dada en relación con el elemento sobre el que se invoca.

position
Una DOMString que representa la posición relativa al elemento; debe ser una de las siguientes cadenas
beforebegin:: antes del elemento en sí.
afterbegin: Justo dentro del elemento, antes de su primer hijo.
beforeend: Justo dentro del elemento, después de su último hijo.
afterend: Después del elemento en sí.

elemento
El elemento que se insertará en el árbol.

También en la familia de insertAdjacenthay los métodos de hermanos:

element.insertAdjacentHTML('afterbegin','htmlText')para inyectar cadenas html directamente, como innerHTMLpero sin anular todo, para que pueda saltar el proceso opresivo document.createElemente incluso construir componentes completos con el proceso de manipulación de cadenas

element.insertAdjacentTextpara inyectar cadena de desinfección en el elemento. no másencode/decode


2
gran sugerencia pero por qué "volver a 2017", este es un método estándar incluso en ie8
Vitaliy Terziev

Gracias. y otro agradecimiento por su comprensión. El título es para ayudar a las personas a distinguir rápidamente esa es una nueva respuesta
Pery Mimon

¿Qué sucede si element = document.importNode (documentfragment, true)?
Martin Meeser

que el regreso elementtypeof document-fragmentque no tiene insertAdjacent...(). hasta que tengamos una mejor respuesta, su mejor conjetura es agregar el fragmenta div. haz tu manipulación dom y luego usa Range.selectNodeContents()y Range.extractContents()para recuperar un fragmento
pery mimon

donde 'elemento' es el elemento en el que desea agregar, y 'elemento' es el elemento que desea agregar;)
bokkie

96

Versión 2018

parentElement.prepend(newFirstChild)

¡Esto es JS moderno! Es más legible que las opciones anteriores. Actualmente está disponible en Chrome, FF y Opera.

PD: puede anteponer cadenas directamente

parentElement.prepend('This text!')

developer.mozilla.org

¿Puedo usar - 94% mayo 2020

Polyfill


66
Gran solución, gracias! Me molesta que hayan decidido agregar un niño al final, .appendChild()pero agregarlo al principio es en .prepend()lugar de apegarse a la convención y llamarlo.prependChild()
Marquizzo

1
append()existe también, funciona de la misma manera que prepend(), pero al final
Gibolt

1
También me confundí cuando vi estas preguntas sobre la implementación prependmientras descubrí que ya era eso. :( Ok, no existía en el pasado.
Rick

10

Puede implementarlo directamente en todos los elementos html de su ventana.
Me gusta esto :

HTMLElement.prototype.appendFirst=function(childNode){
    if(this.firstChild)this.insertBefore(childNode,this.firstChild);
    else this.appendChild(childNode);
};

prependes el vainilla JS equivalente, sin necesidad de un prototipo. Será estándar en ES7, y debe usarlo si es posible para su aplicación
Gibolt

6

Respuesta aceptada refactorizada en una función:

function prependChild(parentEle, newFirstChildEle) {
    parentEle.insertBefore(newFirstChildEle, parentEle.firstChild)
}

+1 por usar la relación padre-hijo. La respuesta aceptada carece de eso. Necesito saber qué eElementtiene sentido. Y para eso, necesito leer la pregunta. La mayoría de las veces, solo verifico el título y voy directamente a la respuesta, ignorando los detalles de la pregunta.
akinuri

4

A menos que haya entendido mal:

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

O

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

Aunque por su descripción parece que hay alguna condición adjunta, entonces

if (SomeCondition){
    $("e").prepend("<yourelem>Text</yourelem>");
}
else{
    $("e").append("<yourelem>Text</yourelem>");
}

¡+1 para la versión $! Estoy escribiendo una función jQuery extend, así que usaré la versión nativa siempre que pueda por razones de rendimiento, ¡pero esto es perfecto!
Taylor Evanson

Na, está buscando JavaScript, no jquery.
Vinilo

2

Creo que estás buscando la función .prepend en jQuery. Código de ejemplo:

$("#E").prepend("<p>Code goes here, yo!</p>");

¡Ustedes son rápidos! Lo siento, creo que me malinterpretaron. elemento e | - child-el_1 | - child-el_2 | - child-el_3 Y luego viene child-el_4 ... que debe ajustarse como primer hijo. prepend pondría child-el_4 antes de [b] e [/ b], ¿estoy equivocado y cansado o qué?
Popara

0

Creé este prototipo para anteponer elementos al elemento padre.

Node.prototype.prependChild = function (child: Node) {
    this.insertBefore(child, this.firstChild);
    return this;
};

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.