DOM öğesi ilk çocuk olarak nasıl ayarlanır?


243

E elementim var ve ona bazı elementler ekliyorum. Birdenbire, bir sonraki elementin E'nin ilk çocuğu olması gerektiğini anladım. Hile nedir, nasıl yapılır? Unshift yöntemi çalışmaz, çünkü E dizi değil, bir nesnedir.

Uzun yol, E'nin çocuklarından tekrarlamak ve anahtar ++ 'ı taşımaktır, ancak eminim ki daha güzel bir yol var.


1
Siz hızlısınız! Üzgünüm, sanırım yanlış anlaşıldım. eleman e | - child-el_1 | - child-el_2 | - child-el_3 Ve sonra ilk çocuk olarak uygun olması gereken child-el_4 ... geliyor. Başa dön child-el_4'ü [b] e [/ b] önüne koyardım, yanlış ve yorgun muyum ya da ne?
Popara

Yanıtlar:


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

eElement.insertBefore(newFirstElement, eElement.firstChild);

3
Sen arkadaşım, kendine bir ayı aldın! Faydalı ekstra bulma. docs.jquery.com/Manipulation/insertBefore
Popara

79
Ebeveynte öğe yoksa bilgi için çocuk yine de eklenir.
Knu

FirstChild durumunda metin düğümü istisna atar. ama jquery başa çıkmaz.
Sergey Sahakyan

3
@Sergey, benim için de metin düğümü ile çalışıyor, Firefox ve Chromium'da test edildi. Hangi tarayıcıyı kullandınız? Sorunun sizin tarafınızdan olmadığından emin misiniz? Sorunu yeniden üreten bir pasaj / jsfiddle hazırlar mısınız?
kullanıcı

list.outerHTML = giriş.outerHTML + list.outerHTML; Umut birine yardım eder.
Deniz Porsuk

106

2017 sürümü

Kullanabilirsiniz

targetElement.insertAdjacentElement('afterbegin', newFirstElement)

Gönderen MDN'yi :

İnsertAdjacentElement () yöntemi, belirli bir öğeyi çağrıldığı öğeye göre belirli bir konuma ekler.

konum
Elemana göre konumu temsil eden bir DOMString; şu dizelerden biri olmalıdır
beforebegin:: Öğenin kendisinden önce.
afterbegin: Elemanın hemen içinde, ilk çocuğundan önce.
beforeend: Elemanın hemen içinde, son çocuğundan sonra.
afterend: Elemanın kendisinden sonra.

element
Ağaca eklenecek öğe.

Ayrıca ailesinde insertAdjacentkardeş yöntemleri vardır:

element.insertAdjacentHTML('afterbegin','htmlText')html dizesini doğrudan enjekte etmek için, innerHTMLancak her şeyi geçersiz kılmaksızın, böylece baskıcı süreci atlayabilir document.createElementve hatta dize manipülasyon işlemi ile tüm bileşenleri bile oluşturabilirsiniz.

element.insertAdjacentTextdize elemanına sterilize etmek için. daha fazla yokencode/decode


2
harika bir öneri ama neden "geri 2017", bu ie8 bile standart bir yöntemdir
Vitaliy Terziev 18:17

Teşekkürler. ve görüşleriniz için bir teşekkür daha. başlık, insanların hızlı bir şekilde ayırt etmelerine yardımcı
olmaktır

Element = document.importNode (documentfragment, true) olursa ne olur?
Martin Meeser

dönüş olduğunu elementtypeof document-fragmentyok olduğunu insertAdjacent...(). biz daha iyi bir cevap olana kadar en iyi tahmin fragmentbir div. dom manipülasyon yapmak ve daha sonra kullanın Range.selectNodeContents()ve Range.extractContents()bir parça geri almak için
pery mimon

burada 'element' eklemek istediğiniz öğedir ve 'element' eklemek istediğiniz öğedir;)
bokkie

96

2018 sürümü

parentElement.prepend(newFirstChild)

Bu modern JS! Önceki seçeneklerden daha okunabilir. Şu anda Chrome, FF ve Opera'da kullanılabilir.

PS Doğrudan dizeleri başa ekleyebilirsiniz

parentElement.prepend('This text!')

developer.mozilla.org

Kullanabilir miyim -% 94 Mayıs 2020

polyfill


6
Harika bir çözüm, teşekkürler! Bana sonuna kadar bir çocuk eklemeye karar verdiklerini söyler .appendChild()ama başa eklemek .prepend(), konvansiyona bağlı kalmak ve çağırmak yerine.prependChild()
Marquizzo

1
append()de var, aynı şekilde çalışıyor prepend(), ama sonunda
Gibolt

1
prependZaten öyle olduğunu fark ederken bu soruların uygulanması hakkında sorular sorduğumda da kafam karıştı . :( Tamam, geçmişte yoktu.
Rick

10

Tüm pencere html öğelerinize doğrudan uygulayabilirsiniz.
Bunun gibi :

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

prependprototipe ihtiyaç duymadan vanilya JS eşdeğeri. ES7'de standart olacak ve uygulamanız için mümkünse kullanmalısınız
Gibolt

6

Kabul edilen cevap bir işleve yeniden düzenlenmiştir:

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

Üst çocuk ilişkisini kullanmak için +1. Kabul edilen cevapta eksiklik var. Bunun eElementmantıklı olması için ne olduğunu bilmeliyim . Ve bunun için soruyu okumam gerekiyor. Çoğu zaman, sadece başlığı kontrol ediyorum ve soru ayrıntılarını göz ardı ederek doğrudan cevaba gidiyorum.
akinuri

4

Yanlış anlamadıysam:

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

Veya

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

Açıklamanızdan, bazı koşulların eklenmiş gibi görünse de,

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

$ Sürümü için +1! Bir jQuery genişletme fonk yazıyorum, bu yüzden performans nedenleriyle yapabildiğim zaman yerel sürümü kullanacağım, ama bu mükemmel!
Taylor Evanson

Na, JavaScript arıyor, jquery değil.
vinyll

2

Bence jQuery .prepend işlevini arıyorsunuz . Örnek kod:

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

Siz hızlısınız! Üzgünüm, sanırım yanlış anlaşıldım. eleman e | - child-el_1 | - child-el_2 | - child-el_3 Ve sonra ilk çocuk olarak uygun olması gereken child-el_4 ... geliyor. Başa dön child-el_4'ü [b] e [/ b] önüne koyardım, yanlış ve yorgun muyum ya da ne?
Popara

0

Bu prototipi, elemanları üst öğeye yerleştirmek için oluşturdum.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.