Làm cách nào tôi có thể triển khai trả trước và nối thêm với JavaScript thông thường?


150

Làm cách nào tôi có thể triển khai trả trướcnối thêm với JavaScript thông thường mà không cần sử dụng jQuery?


1
Tôi không hiểu ý của bạn.
Pekka

@GenericTypeTea: Tôi cũng đã làm như vậy ... Tôi sẽ để nó một mình bây giờ!
Mark Byers

@Mark - Chỉnh sửa của bạn đã tốt hơn :).
djdd87

Câu trả lời:


147

Có lẽ bạn đang hỏi về các phương thức DOM appendChildinsertBefore.

parentNode.insertBefore(newChild, refChild)

Chèn nút newChildlà con của parentNodetrước nút con hiện có refChild. (Trả về newChild.)

Nếu refChildlà null, newChildđược thêm vào cuối danh sách trẻ em. Tương đương, và dễ đọc hơn, sử dụng parentNode.appendChild(newChild).


7
Vì vậy, trả trước về cơ bản là thế nàyfunction prepend(tag, ele) { var x =document.getElementsByTagName(tag)[0]; x.insertBefore(ele ,x.children[0]); }
Muhammad Umer

166

Đây là một đoạn để giúp bạn đi:

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.firstChildsẽ cho chúng ta một tham chiếu đến phần tử đầu tiên bên trong theParentvà đặt theKidtrước nó.


Cảm ơn, tại sao để trả trước chỉ cần sử dụng insertB Before mà không tạo thêm div? như câu trả lời của Grumdrig?
Yosef

điều này tạo ra một yếu tố và thêm nó vào dom, nối và bổ sung công việc khác nhau
Andrei Cristian Prodan

Tôi nhận được một câu trả lời này so với Grumdig của
andrew

10
Đó là năm 2015. Chúng ta có thể có một prepend()phương thức được xây dựng chưa?
1,21 gigawatt

Node.append hoặc node.appendChild là các phương thức void, thay vào đó, hãy sử dụng insertB Before (nút, null)
Suhayb

28

Bạn đã không cho chúng tôi nhiều thứ để tiếp tục ở đây, nhưng tôi nghĩ bạn chỉ hỏi làm thế nào để thêm nội dung vào đầu hoặc cuối của một yếu tố? Nếu vậy đây là cách bạn có thể làm điều đó khá dễ dàng:

//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;

Khá dễ.


Đẹp, chỉ là những gì tôi đang tìm kiếm.
Andrei Cristian Prodan

2
@Munzilla Phương pháp này sẽ buộc trình duyệt phân tích lại tất cả các trẻ em hiện có. Trong các giải pháp trên, Trình duyệt chỉ cần đính kèm đứa trẻ đã cho vào tài liệu.
Sayam Qazi

12

Nếu bạn muốn chèn một chuỗi HTML thô cho dù phức tạp đến đâu, bạn có thể sử dụng : insertAdjacentHTML, với đối số đầu tiên phù hợp:

'beforebegin' Trước chính phần tử. 'afterbegin' Ngay bên trong phần tử, trước đứa con đầu tiên của nó. 'trước đó' 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ó.

Gợi ý: bạn luôn có thể gọi Element.outerHTMLđể lấy chuỗi HTML đại diện cho phần tử được chèn.

Một ví dụ về cách sử dụng:

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

BẢN GIỚI THIỆU

Chú ý: insertAdjacentHTML không bảo tồn người nghe mà gắn liền với .addEventLisntener.


" insertAdjacentHTMLKhông bảo tồn người nghe ..." Người nghe gì? Đó là HTML, vì vậy không có bất kỳ yếu tố nào được ràng buộc. Nếu bạn đang đề cập đến các yếu tố hiện có bên trong foo, thì đó không phải là một tuyên bố đúng. Toàn bộ quan điểm .insertAdjacentHTMLlà nó bảo tồn người nghe. Bạn có thể nghĩ về .innerHTML += "..."việc phá hủy các nút DOM cũ.
đánh đòn

@spanky Bạn nói đúng rằng câu lệnh có thể được diễn giải theo nhiều cách, điều tôi thực sự muốn nói là các nút DOM được tạo mới bằng insertAdjacentHTML(không phải gốc cũng không phải là hậu duệ của gốc)
artur grzeiak

6

Tôi đã thêm điều này vào dự án của tôi và nó dường như hoạt động:

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]);
    }
};

Thí dụ:

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

5

Để đơn giản hóa cuộc sống của bạn, bạn có thể mở rộng HTMLElementđối tượng. Nó có thể không hoạt động cho các trình duyệt cũ hơn, nhưng chắc chắn làm cho cuộc sống của bạn dễ dàng hơn:

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);
    }
};

Vì vậy, lần tới bạn có thể làm điều này:

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

1
Nếu nút không có nút con thì sao? Trong trường hợp đó, FirstChild sẽ là null
felixfbecker

trả trước đã tồn tại, xem ParentNode.prepend (), vì vậy để thực hiện preendChild, hãy gọi prnt.prepend (chld)
Igor Fomenko

2

Đây là một ví dụ về việc sử dụng trả trước để thêm một đoạn vào tài liệu.

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

kết quả:

<p>Example text</p>

1

Vào năm 2017 tôi biết cho Edge 15 và IE 12, phương thức trả trước không được bao gồm như một thuộc tính cho các phần tử Div, nhưng nếu có ai cần tham khảo nhanh về polyfill một chức năng tôi đã thực hiện:

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

Chức năng mũi tên đơn giản tương thích với hầu hết các trình duyệt hiện đại.


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

Nếu ReferenceEuity là null hoặc không xác định, newEuity được chèn vào cuối danh sách các nút con.

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.

Ví dụ có thể được tìm thấy ở đây: Node.insertB Before



-1

Đây không phải là cách tốt nhất để làm điều đó nhưng nếu bất cứ ai muốn chèn một yếu tố trước mọi thứ, đây là một cách.

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);
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.