Як встановити елемент DOM як першу дитину?


243

У мене є елемент Е, і я додаю до нього деякі елементи. Раптом я дізнаюсь, що наступним елементом має стати перша дитина Е. Яка хитрість, як це зробити? Незмінний спосіб не працює, оскільки E - це об'єкт, а не масив.

Довгий шлях був би пройти через дітей Е і перейти до клавіші ++, але я впевнений, що є гарніший спосіб.


1
Ви, хлопці, швидко! Вибачте, я думаю, що мене зрозуміли неправильно. елемент e | - child-el_1 | - child-el_2 | - child-el_3 І тоді з'являється child-el_4 ... який повинен бути придатним як перша дитина. Prepend поставив би child-el_4 перед [b] e [/ b], я помиляюся і втомився чи що?
Попара

Відповіді:


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

eElement.insertBefore(newFirstElement, eElement.firstChild);

3
Ти мій друг, щойно ти сам себе ведмедиком! Корисна додаткова знахідка. docs.jquery.com/Manipulation/insertBefore
Popara

79
Для інформації, якщо в батьків немає елемента, дитина все одно буде доданий.
Кну

У випадку firstChild - виняток кидає текстовий вузол. але jquery prepend dous не.
Сергій Саак’ян

3
@Sergey, працює для мене і з текстовим вузлом, перевіреним на Firefox та Chromium. Який браузер ви використовували? Ви впевнені, що проблема не була на вашому боці? Чи хотіли б ви підготувати фрагмент / jsfiddle, який відтворює проблему?
користувач

list.outerHTML = entry.outerHTML + list.outerHTML; Надія комусь допомагає.
Деніз Порсук

106

Версія 2017 року

Можна використовувати

targetElement.insertAdjacentElement('afterbegin', newFirstElement)

Від MDN :

Метод insertAdjacentElement () вставляє заданий вузол елемента у заданому положенні відносно елементу, на який він викликається.

позиція
A DOMString, що представляє положення відносно елемента; повинен бути один із наступних рядків
beforebegin:: Перед самим елементом.
afterbegin: Просто всередині елемента, перед його першою дитиною.
beforeend: Просто всередині елемента, після останньої дитини.
afterend: Після самого елемента.

елемент
Елемент, який потрібно вставити в дерево.

Також в родині insertAdjacentє методи братів і сестер:

element.insertAdjacentHTML('afterbegin','htmlText')вводити HTML-рядок безпосередньо, як, innerHTMLале без перекриття всього, так що ви можете стрибати гнітючий процес document.createElementі навіть будувати цілий компонет за допомогою маніпуляції з рядком

element.insertAdjacentTextдля ін'єкції санітизувати рядок в елемент. не більшеencode/decode


2
чудова пропозиція, але чому "назад у 2017", це стандартний метод навіть на ie8
Віталій Терзієв

Дякую. і ще одна подяка за ваше розуміння. Заголовок - допомогти людям швидко розрізнити, що є новою відповіддю
pery mimon

Що робити, якщо елемент = document.importNode (documentfragment, true)?
Мартін Мізер

той elementтип повернення, document-fragmentякого немає insertAdjacent...(). поки ми не знайдемо кращої відповіді, найкраща здогадка - додавати fragmentдо а div. зробити свою маніпуляцію DOM , а потім використовувати Range.selectNodeContents()і Range.extractContents()отримати назад фрагмент
перий Mimon

де 'element' - це елемент, у який ви хочете додати, а 'element' - елемент, який ви хочете додати;)
bokkie

96

2018 версія

parentElement.prepend(newFirstChild)

Це сучасний JS! Він легше читається, ніж попередні варіанти. Наразі він доступний у Chrome, FF та Opera.

PS Ви можете безпосередньо додати рядки

parentElement.prepend('This text!')

developer.mozilla.org

Чи можу я використовувати - 94% травня 2020 року

Поліфіл


6
Чудове рішення, дякую! Мене це дратує, що вони вирішили додати дитину до кінця, .appendChild()але додавання її до початку - це .prepend()замість того, щоб дотримуватися конвенції та називати її.prependChild()
Marquizzo

1
append()існує також, працює так само, як prepend()і в кінці
Gibolt

1
Я також розгубився, коли побачив, що ці питання задають питання про реалізацію, prependале я виявив, що це вже так. :( Ок, це не існувало в минулому.
Рік,

10

Ви можете реалізувати його безпосередньо i всі елементи html вашого вікна.
Подобається це :

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

prependє еквівалентом ванільного JS, не потребуючи прототипу. Це буде стандартно в ES7, і ви повинні використовувати, якщо можливо, для своєї заявки
Gibolt

6

Прийнята відповідь відновлена ​​у функції:

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

+1 за використання батьківських стосунків. Прийнятої відповіді бракує цього. Мені потрібно знати, що eElementдля цього має сенс. І для цього мені потрібно прочитати питання. Більшу частину часу я просто перевіряю заголовок і переходжу безпосередньо до відповіді, ігноруючи деталі запитання.
akinuri

4

Якщо я не зрозумів неправильно:

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

Або

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

Хоча з вашого опису це здається, що додається якась умова, тож

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

+1 за версію $! Я пишу функцію розширення jQuery, тому я буду використовувати рідну версію, коли можу, з міркувань продуктивності, але це ідеально!
Тейлор Евансон

Ні, він шукає JavaScript, а не jquery.
vinyll

2

Я думаю, ви шукаєте функцію .prepend в jQuery. Приклад коду:

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

Ви, хлопці, швидко! Вибачте, я думаю, що мене зрозуміли неправильно. елемент e | - child-el_1 | - child-el_2 | - child-el_3 І тоді з'являється child-el_4 ... який повинен бути придатним як перша дитина. Prepend поставив би child-el_4 перед [b] e [/ b], я помиляюся і втомився чи що?
Попара

0

Я створив цей прототип для додавання елементів до батьківського елемента.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.