Як я можу реалізувати додавання та додавання за допомогою звичайного JavaScript?


150

Як я можу реалізувати PREPEND і Append з регулярним JavaScript без використання JQuery?


1
Я не розумію, що ти маєш на увазі.
Pekka

@GenericTypeTea: Так я зробив приблизно в той же час ... Я зараз залишу його в спокої!
Марк Байєрс

@Mark - Ваша редакція була кращою :).
djdd87

Відповіді:


147

Можливо, ви питаєте про методи DOM appendChild та insertBefore.

parentNode.insertBefore(newChild, refChild)

Вставляє вузол newChildяк дочірнє parentNodeперед існуючим дочірнім вузлом refChild. (Повертається newChild.)

Якщо refChildнуль, newChildдодається в кінці списку дітей. Еквівалентно і з легкістю читайте використання parentNode.appendChild(newChild).


7
тому препендія в основному це тодіfunction prepend(tag, ele) { var x =document.getElementsByTagName(tag)[0]; x.insertBefore(ele ,x.children[0]); }
Мухаммед Умер

166

Ось фрагмент:

theParent = document.getElementById("theParent");
theKid = document.createElement("div");
theKid.innerHTML = 'Are we there yet?';

// append theKid to the end of theParent
theParent.appendChild(theKid);

// prepend theKid to the beginning of theParent
theParent.insertBefore(theKid, theParent.firstChild);

theParent.firstChildдасть нам посилання на перший елемент всередині theParentі поставить theKidперед ним.


Дякую, чому для препенду просто використовуйте insertBefore без створення додаткових ділів? як відповідь Grumdrig?
Йосеф

це створює елемент і додає його до дому, додає та додає роботу по-різному
Андрій Крістіан Продан,

Я отримую цю порівняну з відповіддю Грумдіга
andrew

10
Це 2015. Чи можемо ми ще вбудувати prepend()метод?
1,21 гігаватт

Node.append або node.appendChild є недійсними методами, замість цього використовуйте insertBefore (node, null)
Suhayb

28

Ви не дали нам багато чого продовжувати, але я думаю, ви просто запитуєте, як додати вміст до початку чи кінця елемента? Якщо так, ось як це зробити досить легко:

//get the target div you want to append/prepend to
var someDiv = document.getElementById("targetDiv");

//append text
someDiv.innerHTML += "Add this text to the end";

//prepend text
someDiv.innerHTML = "Add this text to the beginning" + someDiv.innerHTML;

Досить легко.


Приємно, саме те, що я шукав.
Андрій Крістіан Продан,

2
@Munzilla Цей метод змусить браузер знову проаналізувати всі існуючі діти. У вищезазначених рішеннях браузер просто повинен прикріпити дану дитину до документа.
Саям Казі

12

Якщо ви хочете вставити необроблений рядок HTML, незалежно від складності, ви можете використовувати:, insertAdjacentHTMLз відповідним першим аргументом:

'перед початком ' Перед самим елементом. 'afterbegin' Просто всередині елемента, перед його першою дитиною. "перед тим", що знаходиться всередині елемента, після останнього дочірнього елемента. 'afterend' Після самого елемента.

Підказка: завжди можна зателефонувати Element.outerHTML щоб отримати рядок HTML, що представляє елемент, який потрібно вставити.

Приклад використання:

document.getElementById("foo").insertAdjacentHTML("beforeBegin",
          "<div><h1>I</h1><h2>was</h2><h3>inserted</h3></div>");

DEMO

Застереження: insertAdjacentHTML не зберігає слухачів, що там, де вони додаються .addEventLisntener.


" insertAdjacentHTMLне зберігає слухачів ..." Які слухачі? Це HTML, тому немає ще жодних елементів для прив’язки. Якщо ви мали на увазі наявні елементи всередині foo, то це неправдиве твердження. Вся справа в .insertAdjacentHTMLтому, що це зберігає слухачів. Ви, можливо, думаєте про те .innerHTML += "...", що руйнує старі вузли DOM.
шпигун

@spanky Ви маєте рацію, що твердження може бути інтерпретовано декількома способами, що я насправді мав на увазі, що це свіжо створені вузли DOM insertAdjacentHTML(не корінь, ані наявні нащадки кореня)
artur grzesiak

6

Я додав це до свого проекту і, здається, працює:

HTMLElement.prototype.prependHtml = function (element) {
    const div = document.createElement('div');
    div.innerHTML = element;
    this.insertBefore(div, this.firstChild);
};

HTMLElement.prototype.appendHtml = function (element) {
    const div = document.createElement('div');
    div.innerHTML = element;
    while (div.children.length > 0) {
        this.appendChild(div.children[0]);
    }
};

Приклад:

document.body.prependHtml(`<a href="#">Hello World</a>`);
document.body.appendHtml(`<a href="#">Hello World</a>`);

5

Щоб спростити своє життя, ви можете розширити HTMLElementоб'єкт. Це може не працювати для старих браузерів, але, безумовно, полегшує ваше життя:

HTMLElement = typeof(HTMLElement) != 'undefined' ? HTMLElement : Element;

HTMLElement.prototype.prepend = function(element) {
    if (this.firstChild) {
        return this.insertBefore(element, this.firstChild);
    } else {
        return this.appendChild(element);
    }
};

Тож наступного разу ви можете це зробити:

document.getElementById('container').prepend(document.getElementById('block'));
// or
var element = document.getElementById('anotherElement');
document.body.prepend(div);

1
що робити, якщо у вузла немає дочірніх вузлів? У цьому випадку firstChild буде нульовим
felixfbecker

препенд вже існує, див. ParentNode.prepend (), тож, щоб зробити prependChild, достатньо зателефонувати prnt.prepend (chld)
Ігор Фоменко

2

Ось приклад використання препенду для додавання абзацу до документа.

var element = document.createElement("p");
var text = document.createTextNode("Example text");
element.appendChild(text);
document.body.prepend(element);

результат:

<p>Example text</p>

1

У 2017 році я знаю для Edge 15 та IE 12, метод prepend не включається як властивість елементів Div, але якщо комусь потрібно швидке посилання на функцію polyfill, я зробив це:

 HTMLDivElement.prototype.prepend = (node, ele)=>{ 
               try { node.insertBefore(ele ,node.children[0]);} 
                     catch (e){ throw new Error(e.toString()) } }

Проста функція стрілки, сумісна з більшістю сучасних браузерів.


0
var insertedElement = parentElement.insertBefore(newElement, referenceElement);

Якщо referenceElement є нульовим або невизначеним, newElement вставляється в кінці списку дочірніх вузлів.

insertedElement The node being inserted, that is newElement
parentElement The parent of the newly inserted node.
newElement The node to insert.
referenceElement The node before which newElement is inserted.

Приклади можна знайти тут: Node.insertBefore



-1

Це не найкращий спосіб зробити це, але якщо хтось хоче вставити елемент перед усім, ось такий спосіб.

var newElement = document.createElement("div");
var element = document.getElementById("targetelement");
element.innerHTML = '<div style="display:none !important;"></div>' + element.innerHTML;
var referanceElement = element.children[0];
element.insertBefore(newElement,referanceElement);
element.removeChild(referanceElement);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.