Làm cách nào để đặt phần tử DOM làm con đầu tiên?


243

Tôi có phần tử E và tôi đang nối thêm một số phần tử vào nó. Thật bất ngờ, tôi phát hiện ra rằng yếu tố tiếp theo nên là đứa con đầu tiên của E. Bí quyết là gì, làm thế nào để làm điều đó? Phương pháp unshift không hoạt động vì E là một đối tượng, không phải là mảng.

Con đường dài sẽ là lặp đi lặp lại những đứa trẻ của E và di chuyển khóa ++, nhưng tôi chắc chắn rằng có một cách đẹp hơn.


1
Các bạn nhanh thật! Tôi xin lỗi, tôi nghĩ rằng tôi đã bị hiểu lầm. phần tử e | - child-el_1 | - child-el_2 | - child-el_3 Và sau đó đến child-el_4 ... cần phải phù hợp như đứa trẻ đầu tiên. trả trước sẽ đặt con-el_4 trước [b] e [/ b], tôi có sai và mệt không?
Popara

Câu trả lời:


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

eElement.insertBefore(newFirstElement, eElement.firstChild);

3
Bạn của tôi, chỉ cần có một con gấu của bạn! Tìm kiếm thêm hữu ích. docs.jquery.com/Manipulation/insertB Before
Popara

79
Để biết thông tin nếu không có phần tử nào trong phần cha mẹ, đứa trẻ sẽ được thêm vào.
Knu

Trong trường hợp của FirstChild là nút văn bản ném ngoại lệ. nhưng jquery trả trước dous không.
Serge Sahakyan

3
@Sergey, cũng hoạt động với tôi với nút văn bản, đã được thử nghiệm trên Firefox và Chromium. Bạn đã sử dụng trình duyệt nào? Bạn có chắc vấn đề không nằm ở phía bạn? Bạn có quan tâm để chuẩn bị một đoạn trích / jsfiddle tái tạo vấn đề không?
người dùng

list.outerHTML = entry.outerHTML + list.outerHTML; Hy vọng giúp được ai đó.
Deniz Porsuk

106

Phiên bản 2017

Bạn có thể dùng

targetElement.insertAdjacentElement('afterbegin', newFirstElement)

Từ MDN :

Phương thức insertAdjighborEuity () chèn một nút phần tử đã cho vào một vị trí nhất định so với phần tử mà nó được gọi.

vị trí
Một DOMString đại diện cho vị trí liên quan đến phần tử; phải là một trong các chuỗi sau
beforebegin:: Trước chính phần tử.
afterbegin: Chỉ bên trong các yếu tố, trước khi đứa con đầu tiên của nó.
beforeend: Chỉ bên trong phần tử, sau đứa con cuối cùng của nó.
afterend: Sau phần tử chính nó.

phần tử
Phần tử được chèn vào cây.

Ngoài ra trong gia đình insertAdjacentcó các phương pháp anh chị em:

element.insertAdjacentHTML('afterbegin','htmlText')để tiêm chuỗi html trực tiếp, thích innerHTMLnhưng không làm quá tất cả mọi thứ, vì vậy bạn có thể nhảy quá trình áp bức document.createElementvà thậm chí xây dựng toàn bộ thành phần với quy trình thao tác chuỗi

element.insertAdjacentTextcho chuỗi khử trùng vào phần tử. không còn nữaencode/decode


2
gợi ý tuyệt vời nhưng tại sao "trở lại năm 2017", đây là một phương pháp tiêu chuẩn ngay cả trên eg8
Vitaliy Terziev

cảm ơn. và một lời cảm ơn khác cho cái nhìn sâu sắc của bạn. tiêu đề là để giúp mọi người phân biệt nhanh chóng đó là câu trả lời mới
pery mimon

Điều gì xảy ra nếu phần tử = document.importNode (documentfragment, true)?
Martin Meeser

mà trở elementtypeof document-fragmentrằng không có insertAdjacent...(). cho đến khi chúng tôi có câu trả lời tốt hơn dự đoán tốt nhất của bạn là nối thêm fragmentvào a div. thực hiện thao tác dom của bạn và sau đó sử dụng Range.selectNodeContents()Range.extractContents()để lấy lại một mảnh
pery mimon

trong đó 'phần tử' là phần tử mà bạn muốn thêm và 'phần tử' là phần tử bạn muốn thêm;)
bokkie

95

Phiên bản 2018

parentElement.prepend(newFirstChild)

Đây là JS hiện đại! Nó dễ đọc hơn các tùy chọn trước đó. Nó hiện có sẵn trong Chrome, FF và Opera.

PS Bạn có thể trực tiếp thêm chuỗi

parentElement.prepend('This text!')

nhà phát triển.mozilla.org

Tôi có thể sử dụng - 94% tháng 5 năm 2020

Polyfill


6
Giải pháp tuyệt vời, cảm ơn! Điều đó làm tôi bực mình vì họ đã quyết định thêm một đứa trẻ vào cuối .appendChild()nhưng việc thêm nó vào đầu là .prepend()thay vì tuân theo quy ước và gọi nó.prependChild()
Marquizzo 26/07/19

1
append()cũng tồn tại, hoạt động theo cách tương tự prepend(), nhưng cuối cùng
Gibolt

1
Tôi cũng đã bối rối khi thấy những câu hỏi này hỏi về việc thực hiện prependtrong khi tôi thấy nó đã được như vậy. :( Ok, nó không tồn tại trong quá khứ.
Rick

10

Bạn có thể thực hiện nó trực tiếp i tất cả các yếu tố html cửa sổ của bạn.
Như thế này :

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

prependlà tương đương với vanilla JS, không cần nguyên mẫu. Nó sẽ là tiêu chuẩn trong ES7 và bạn nên sử dụng nếu có thể cho ứng dụng của mình
Gibolt

6

Câu trả lời được chấp nhận được tái cấu trúc thành một hàm:

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

+1 để sử dụng mối quan hệ cha mẹ con. Câu trả lời được chấp nhận thiếu điều đó. Tôi cần phải biết những gì eElementcho nó có ý nghĩa. Và để làm điều đó, tôi cần phải đọc câu hỏi. Hầu hết thời gian, tôi chỉ kiểm tra tiêu đề và đi thẳng vào câu trả lời, bỏ qua các chi tiết câu hỏi.
akinuri

4

Trừ khi tôi đã hiểu lầm:

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

Hoặc là

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

Mặc dù có vẻ như từ mô tả của bạn rằng có một số điều kiện kèm theo, vì vậy

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

+1 cho phiên bản $! Tôi đang viết một jQuery mở rộng func, vì vậy tôi sẽ sử dụng phiên bản gốc bất cứ khi nào tôi có thể vì lý do hiệu suất, nhưng điều này là hoàn hảo!
Taylor Evanson

Na, anh ta đang tìm kiếm JavaScript, không phải jquery.
vinyll 16/2/2016

2

Tôi nghĩ rằng bạn đang tìm kiếm hàm .prepend trong jQuery. Mã ví dụ:

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

Các bạn nhanh thật! Tôi xin lỗi, tôi nghĩ rằng tôi đã bị hiểu lầm. phần tử e | - child-el_1 | - child-el_2 | - child-el_3 Và sau đó đến child-el_4 ... cần phải phù hợp như đứa trẻ đầu tiên. trả trước sẽ đặt con-el_4 trước [b] e [/ b], tôi có sai và mệt không?
Popara

0

Tôi đã tạo nguyên mẫu này để thêm các phần tử vào phần tử cha.

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_insertb Before.asp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.