Come impostare l'elemento DOM come primo figlio?


243

Ho l'elemento E e sto aggiungendo alcuni elementi ad esso. Improvvisamente, scopro che l'elemento successivo dovrebbe essere il primo figlio di E. Qual è il trucco, come farlo? Il metodo di non spostamento non funziona perché E è un oggetto, non un array.

La strada lunga sarebbe quella di iterare attraverso i figli di E e spostare la chiave ++, ma sono sicuro che ci sia un modo più carino.


1
Ragazzi siete veloci! Mi dispiace, penso di essere stato frainteso. element e | - child-el_1 | - child-el_2 | - child-el_3 E poi arriva child-el_4 ... che deve essere in forma come primo figlio. antepone metterebbe child-el_4 prima di [b] e [/ b], sbaglio e stanco o cosa?
Popara,

Risposte:


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

eElement.insertBefore(newFirstElement, eElement.firstChild);

3
Amico mio, ti sei appena fatto un orso! Utile scoperta extra. docs.jquery.com/Manipulation/insertBefore
Popara

79
Per informazioni se non è presente alcun elemento nel genitore, il figlio verrà comunque aggiunto.
Knu,

Nel caso di firstChild il nodo di testo genera un'eccezione. ma jquery prepend non lo fa.
Sergey Sahakyan,

3
@Sergey, funziona anche con me con nodo di testo, testato su Firefox e Chromium. Quale browser hai usato? Sei sicuro che il problema non fosse dalla tua parte? Ti andrebbe di preparare uno snippet / jsfiddle che riproduca il problema?
utente

list.outerHTML = entry.outerHTML + list.outerHTML; La speranza aiuta qualcuno.
Deniz Porsuk,

106

Versione 2017

Puoi usare

targetElement.insertAdjacentElement('afterbegin', newFirstElement)

Da MDN :

Il metodo insertAdjacentElement () inserisce un dato nodo di elemento in una data posizione rispetto all'elemento su cui viene invocato.

position
A DOMString che rappresenta la posizione relativa all'elemento; deve essere una delle stringhe seguenti
beforebegin:: Prima dell'elemento stesso.
afterbegin: Appena dentro l'elemento, prima del suo primo figlio.
beforeend: Appena dentro l'elemento, dopo il suo ultimo figlio.
afterend: Dopo l'elemento stesso.

element
L'elemento da inserire nell'albero.

Anche nella famiglia di insertAdjacentci sono i metodi di pari livello:

element.insertAdjacentHTML('afterbegin','htmlText')per iniettare direttamente una stringa html, come innerHTMLma senza ignorare tutto, in modo da poter saltare il processo oppressivo document.createElemente persino costruire l'intero componente con il processo di manipolazione della stringa

element.insertAdjacentTextper iniettare la stringa sanitize nell'elemento. non piuencode/decode


2
ottimo suggerimento ma perché "torna al 2017", questo è un metodo standard anche su ie8
Vitaliy Terziev

Grazie. e un altro grazie per la tua comprensione. il titolo è per aiutare le persone a distinguere rapidamente questa è una nuova risposta
pery mimon

Cosa succede se element = document.importNode (documentfragment, true)?
Martin Meeser,

che il ritorno elementtypeof document-fragmentche non ha insertAdjacent...(). fino a quando non avremo una risposta migliore, la tua ipotesi migliore è quella di aggiungere fragmenta div. fai la tua manipolazione dom e poi usa Range.selectNodeContents()e Range.extractContents()per recuperare un frammento
pery mimon

dove 'element' è l'elemento in cui si desidera aggiungere e 'element' è l'elemento che si desidera aggiungere;)
bokkie

96

Versione 2018

parentElement.prepend(newFirstChild)

Questo è JS moderno! È più leggibile rispetto alle opzioni precedenti. È attualmente disponibile in Chrome, FF e Opera.

PS Puoi anteporre direttamente le stringhe

parentElement.prepend('This text!')

developer.mozilla.org

Posso usare - 94% maggio 2020

polyfill


6
Ottima soluzione, grazie! Mi irrita il fatto che abbiano deciso di aggiungere un bambino alla fine, .appendChild()ma aggiungerlo all'inizio è .prepend()invece di attenersi alla convention e chiamarlo.prependChild()
Marquizzo,

1
append()esiste anche, funziona allo stesso modo prepend(), ma alla fine
Gibolt,

1
Mi sono anche confuso quando ho visto queste domande poste sull'implementazione prependmentre ho scoperto che è già stato così. :( Ok, non esisteva in passato.
Rick,

10

Puoi implementarlo direttamente in tutti gli elementi HTML della tua finestra.
Come questo :

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

prependè l'equivalente JS vaniglia, senza bisogno di un prototipo. Sarà standard in ES7 e dovresti usarlo se possibile per la tua applicazione
Gibolt,

6

Risposta accettata refactorizzata in una funzione:

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

+1 per l'utilizzo della relazione figlio principale. La risposta accettata manca. Devo sapere che eElementsenso ha senso. E per questo, ho bisogno di leggere la domanda. Il più delle volte, controllo il titolo e vado direttamente alla risposta, ignorando i dettagli della domanda.
akinuri,

4

A meno che non abbia frainteso:

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

O

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

Anche se sembra dalla tua descrizione che ci sia qualche condizione allegata, quindi

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

+1 per la versione $! Sto scrivendo una funzione di estensione jQuery, quindi userò la versione nativa ogni volta che posso per motivi di prestazioni, ma questo è perfetto!
Taylor Evanson,

Na, sta cercando JavaScript, non jquery.
Vinyll

2

Penso che tu stia cercando la funzione .prepend in jQuery. Codice di esempio:

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

Ragazzi siete veloci! Mi dispiace, penso di essere stato frainteso. element e | - child-el_1 | - child-el_2 | - child-el_3 E poi arriva child-el_4 ... che deve essere in forma come primo figlio. antepone metterebbe child-el_4 prima di [b] e [/ b], sbaglio e stanco o cosa?
Popara,

0

Ho creato questo prototipo per anteporre elementi all'elemento genitore.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.