Comment définir l'élément DOM comme premier enfant?

243

J'ai l'élément E et j'y ajoute quelques éléments. Tout à coup, je découvre que l'élément suivant devrait être le premier enfant de E. Quel est le truc, comment le faire? La méthode unshift ne fonctionne pas car E est un objet, pas un tableau.

Le long chemin serait d'itérer les enfants de E et de les déplacer key ++, mais je suis sûr qu'il y a une plus jolie manière.

Popara
la source
1
Vous êtes rapides! Je suis désolé, je pense que j'ai été mal compris. élément e | - enfant-el_1 | - enfant-el_2 | - enfant-el_3 Et puis vient enfant-el_4 ... qui doit être adapté comme premier enfant. prepend mettrait child-el_4 avant [b] e [/ b], ai-je tort et fatigué ou quoi?
Popara

Réponses:

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

eElement.insertBefore(newFirstElement, eElement.firstChild);
nemisj
la source
3
Toi mon ami, viens de te faire un ours! Conclusion supplémentaire utile. docs.jquery.com/Manipulation/insertBefore
Popara
79
Pour info s'il n'y a pas d'élément dans le parent, l'enfant sera quand même ajouté.
Knu
Dans le cas de firstChild, le nœud de texte renvoie une exception. mais jquery ne l'ajoute pas.
Sergey Sahakyan
3
@Sergey, fonctionne aussi pour moi avec le nœud de texte, testé sur Firefox et Chromium. Quel navigateur avez-vous utilisé? Êtes-vous sûr que le problème n'était pas de votre côté? Souhaitez-vous préparer un extrait / jsfiddle qui reproduit le problème?
utilisateur
list.outerHTML = entry.outerHTML + list.outerHTML; L'espoir aide quelqu'un.
Deniz Porsuk
106

Version 2017

Vous pouvez utiliser

targetElement.insertAdjacentElement('afterbegin', newFirstElement)

De MDN :

La méthode insertAdjacentElement () insère un nœud d'élément donné à une position donnée par rapport à l'élément sur lequel il est invoqué.

position
Une DOMString représentant la position par rapport à l'élément; doit être l'une des chaînes suivantes
beforebegin:: avant l'élément lui-même.
afterbegin: Juste à l'intérieur de l'élément, avant son premier enfant.
beforeend: Juste à l'intérieur de l'élément, après son dernier enfant.
afterend: Après l'élément lui-même.

element
L'élément à insérer dans l'arborescence.

Également dans la famille des insertAdjacentméthodes fraternelles:

element.insertAdjacentHTML('afterbegin','htmlText')pour injecter directement une chaîne html, comme innerHTMLmais sans tout remplacer, vous pouvez donc sauter un processus oppressif document.createElementet même construire un composant entier avec un processus de manipulation de chaîne

element.insertAdjacentTextpour injecter la chaîne de désinfection dans l'élément. Pas plusencode/decode

pery mimon
la source
2
bonne suggestion mais pourquoi "retour à 2017", c'est une méthode standard même sur ie8
Vitaliy Terziev
Merci. et un autre merci pour votre perspicacité. le titre est d'aider les gens à distinguer rapidement c'est une nouvelle réponse
pery mimon
Et si element = document.importNode (documentfragment, true)?
Martin Meeser
que le retour elementtypeof document-fragmentque pas insertAdjacent...(). jusqu'à ce que nous ayons une meilleure réponse, votre meilleure supposition est d'ajouter le fragmentà a div. faites votre manipulation dom puis utilisez Range.selectNodeContents()et Range.extractContents()pour récupérer un fragment
pery mimon
où 'element' est l'élément dans lequel vous voulez ajouter, et 'element' est l'élément que vous voulez ajouter;)
bokkie
96

Version 2018

parentElement.prepend(newFirstChild)

C'est JS moderne! Il est plus lisible que les options précédentes. Il est actuellement disponible dans Chrome, FF et Opera.

PS Vous pouvez directement ajouter des chaînes

parentElement.prepend('This text!')

developer.mozilla.org

Puis-je utiliser - 94% mai 2020

Polyfill

Gibolt
la source
6
Excellente solution, merci! Cela me contrarie qu'ils aient décidé d'ajouter un enfant à la fin, .appendChild()mais l'ajouter au début est .prepend()au lieu de s'en tenir à la convention et de l'appeler.prependChild()
Marquizzo
1
append()existe aussi, fonctionne de la même manière que prepend(), mais à la fin
Gibolt
1
J'ai également été confus lorsque j'ai vu ces questions poser des questions sur la mise prependen œuvre alors que je trouvais que c'était déjà ça. :( Ok, ça n'existait pas dans le passé.
Rick
10

Vous pouvez l'implémenter directement dans tous vos éléments html de fenêtre.
Comme ça :

HTMLElement.prototype.appendFirst=function(childNode){
    if(this.firstChild)this.insertBefore(childNode,this.firstChild);
    else this.appendChild(childNode);
};
yorg
la source
prependest l'équivalent JS vanille, sans avoir besoin d'un prototype. Il sera standard dans ES7, et vous devriez utiliser si possible pour votre application
Gibolt
6

Réponse acceptée refactorisée en fonction:

function prependChild(parentEle, newFirstChildEle) {
    parentEle.insertBefore(newFirstChildEle, parentEle.firstChild)
}
Joseph Dykstra
la source
+1 pour l'utilisation de la relation parent-enfant. La réponse acceptée manque. J'ai besoin de savoir ce eElementque cela a de sens. Et pour cela, je dois lire la question. La plupart du temps, je vérifie simplement le titre et je vais directement à la réponse, en ignorant les détails de la question.
akinuri
4

Sauf si j'ai mal compris:

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

Ou

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

Bien qu'il semble que d'après votre description il y ait une condition attachée, donc

if (SomeCondition){
    $("e").prepend("<yourelem>Text</yourelem>");
}
else{
    $("e").append("<yourelem>Text</yourelem>");
}
James Wiseman
la source
+1 pour la version $! J'écris une fonction jQuery extend, donc j'utiliserai la version native chaque fois que je le pourrai pour des raisons de performances, mais c'est parfait!
Taylor Evanson
Na, il cherche JavaScript, pas jquery.
vinyll
2

Je pense que vous recherchez la fonction .prepend dans jQuery. Exemple de code:

$("#E").prepend("<p>Code goes here, yo!</p>");
Emil Vikström
la source
Vous êtes rapides! Je suis désolé, je pense que j'ai été mal compris. élément e | - enfant-el_1 | - enfant-el_2 | - enfant-el_3 Et puis vient enfant-el_4 ... qui doit être adapté comme premier enfant. prepend mettrait child-el_4 avant [b] e [/ b], ai-je tort et fatigué ou quoi?
Popara
0

J'ai créé ce prototype pour ajouter des éléments à l'élément parent.

Node.prototype.prependChild = function (child: Node) {
    this.insertBefore(child, this.firstChild);
    return this;
};
Raza
la source
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

Ilker Cat
la source