Xóa tất cả các phần tử con của một nút DOM trong JavaScript


873

Làm cách nào để xóa tất cả các phần tử con của nút DOM trong JavaScript?

Nói rằng tôi có HTML (xấu xí) sau:

<p id="foo">
    <span>hello</span>
    <div>world</div>
</p>

Và tôi lấy nút tôi muốn như vậy:

var myNode = document.getElementById("foo");

Làm thế nào tôi có thể loại bỏ những đứa trẻ foođể chỉ <p id="foo"></p>còn lại?

Tôi chỉ có thể làm:

myNode.childNodes = new Array();

hoặc tôi nên sử dụng một số kết hợp removeElement?

Tôi muốn câu trả lời là thẳng lên DOM; mặc dù có thêm điểm nếu bạn cũng cung cấp câu trả lời trong jQuery cùng với câu trả lời chỉ có DOM.

Câu trả lời:


1674

Phương án 1 A: Xóa innerHTML.

  • Cách tiếp cận này đơn giản, nhưng có thể không phù hợp với các ứng dụng hiệu suất cao vì nó gọi trình phân tích cú pháp HTML của trình duyệt (mặc dù các trình duyệt có thể tối ưu hóa cho trường hợp giá trị là một chuỗi rỗng).

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  myNode.innerHTML = '';
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via innerHTML</button>

Tùy chọn 1 B: Xóa textContent

  • Như trên, nhưng sử dụng .textContent. Theo MDN, điều này sẽ nhanh hơn innerHTMLvì các trình duyệt sẽ không gọi trình phân tích cú pháp HTML của họ và thay vào đó sẽ ngay lập tức thay thế tất cả các phần tử con của một phần tử bằng một #textnút.

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  myNode.textContent = '';
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via textContent</button>

Tùy chọn 2 A: Vòng lặp để loại bỏ mọi lastChild:

  • Một chỉnh sửa trước đó cho câu trả lời này đã được sử dụng firstChild, nhưng điều này được cập nhật để sử dụng lastChildnhư trong khoa học máy tính, nói chung , việc loại bỏ phần tử cuối cùng của bộ sưu tập nhanh hơn đáng kể so với cách loại bỏ phần tử đầu tiên (tùy thuộc vào cách thực hiện bộ sưu tập ).
  • Vòng lặp tiếp tục kiểm tra firstChild chỉ trong trường hợp kiểm tra nhanh firstChildhơn lastChild(ví dụ: nếu danh sách thành phần được triển khai dưới dạng danh sách liên kết được định hướng bởi UA).

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  while (myNode.firstChild) {
    myNode.removeChild(myNode.lastChild);
  }
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via lastChild-loop</button>

Tùy chọn 2 B: Vòng lặp để loại bỏ mọi lastElementChild:

  • Cách tiếp cận này bảo tồn tất cả các con không phải Element(cụ thể là #textnút và <!-- comments -->) của cha mẹ (nhưng không phải con cháu của họ) - và điều này có thể được mong muốn trong ứng dụng của bạn (ví dụ: một số hệ thống tạo khuôn mẫu sử dụng nhận xét HTML nội tuyến để lưu trữ hướng dẫn mẫu).
  • Cách tiếp cận này không được sử dụng cho đến những năm gần đây vì Internet Explorer chỉ thêm hỗ trợ cho lastElementChildIE9.

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  while (myNode.lastElementChild) {
    myNode.removeChild(myNode.lastElementChild);
  }
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <!-- This comment won't be removed -->
  <span>Hello <!-- This comment WILL be removed --></span>
  <!-- But this one won't. -->
</div>
<button id='doFoo'>Remove via lastElementChild-loop</button>

Tiền thưởng: Element.clearChildrenkhỉ-patch:

  • Chúng ta có thể thêm một thuộc tính phương thức mới vào Elementnguyên mẫu trong JavaScript để đơn giản hóa việc gọi nó tới el.clearChildren()(nơi elbất kỳ đối tượng phần tử HTML nào ).
  • (Nói đúng ra đây là một bản vá khỉ, không phải là một polyfill, vì đây không phải là một tính năng DOM tiêu chuẩn hoặc tính năng bị thiếu.

if( typeof Element.prototype.clearChildren === 'undefined' ) {
    Object.defineProperty(Element.prototype, 'clearChildren', {
      configurable: true,
      enumerable: false,
      value: function() {
        while(this.firstChild) this.removeChild(this.lastChild);
      }
    });
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello <!-- This comment WILL be removed --></span>
</div>
<button onclick="this.previousElementSibling.clearChildren()">Remove via monkey-patch</button>


6
Từ jQuery, hai vấn đề này có thể được xem xét: Phương pháp này loại bỏ không chỉ các phần tử con (và hậu duệ khác), mà còn bất kỳ văn bản nào trong tập hợp các phần tử phù hợp. Điều này là do, theo đặc tả DOM, bất kỳ chuỗi văn bản nào trong một phần tử đều được coi là nút con của phần tử đó. VÀ "Để tránh rò rỉ bộ nhớ, jQuery loại bỏ các cấu trúc khác như xử lý dữ liệu và sự kiện khỏi các phần tử con trước khi tự loại bỏ các phần tử."
jottos

104
Btw, sử dụng lastChild dường như hiệu quả hơn một chút jsperf.com/innerhtml-vs-removechild/15
Andrey Lushnikov

24
InternalHTML chỉ hoạt động nếu bạn chỉ giao dịch với HTML. Nếu có, ví dụ như SVG bên trong chỉ loại bỏ phần tử sẽ hoạt động
stwissel

34
KHÔNG BAO GIỜ KHÔNG BAO GIỜ KHÔNG BAO GIỜ sử dụng InternalHTML = ''. Đừng. Vấn đề là các mục trông giống như chúng bị xóa nhưng bên trong, các nút vẫn tồn tại và làm mọi thứ chậm lại. Bạn phải loại bỏ tất cả các nút riêng lẻ vì một lý do. Đã thử nghiệm trên cả Google Chrome và IE. Vui lòng xem xét loại bỏ "giải pháp" bên trong vì nó sai.
Kenji

15
@vsync Tôi không tin nhận xét của Kenji là có cơ sở. Làm innerHTML = ''chậm hơn, nhưng tôi không nghĩ nó "sai". Bất kỳ khiếu nại về rò rỉ bộ nhớ nên được sao lưu với bằng chứng.
Chris Middleton

115

Câu trả lời hiện được chấp nhận là sai về innerHTMLviệc chậm hơn (ít nhất là trong IE và Chrome), như m93a đã đề cập chính xác.

Chrome và FF nhanh hơn đáng kể khi sử dụng phương pháp này (sẽ phá hủy dữ liệu jquery đính kèm):

var cNode = node.cloneNode(false);
node.parentNode.replaceChild(cNode, node);

trong một giây xa cho FF và Chrome và nhanh nhất trong IE:

node.innerHTML = '';

InternalHTML sẽ không phá hủy trình xử lý sự kiện của bạn hoặc ngắt các tham chiếu jquery , nó cũng được đề xuất như một giải pháp tại đây: https://developer.mozilla.org/en-US/docs/Web/API/Euity.innerHTML .

Phương thức thao tác DOM nhanh nhất (vẫn chậm hơn hai lần trước) là loại bỏ Phạm vi, nhưng phạm vi không được hỗ trợ cho đến IE9.

var range = document.createRange();
range.selectNodeContents(node);
range.deleteContents();

Các phương thức khác được đề cập có vẻ tương đương, nhưng chậm hơn rất nhiều so với InternalHTML, ngoại trừ jquery (1.1.1 và 3.1.1) ngoại lệ, chậm hơn đáng kể so với mọi thứ khác:

$(node).empty();

Bằng chứng ở đây:

http://jsperf.com/innerhtml-vs-removechild/167 http://jsperf.com/innerhtml-vs-removechild/300 https://jsperf.com/remove-all-child-elements-of-a- dom-node-in-javascript (url mới để khởi động lại jsperf vì chỉnh sửa url cũ không hoạt động)

"Mỗi vòng kiểm tra" của Jsperf thường được hiểu là "mỗi lần lặp" và chỉ lần lặp đầu tiên có các nút để loại bỏ nên kết quả là vô nghĩa, tại thời điểm đăng bài có các bài kiểm tra trong luồng này được thiết lập không chính xác.


2
Jsperf của bạn bị hỏng hoàn toàn. Đó không phải là bằng chứng tốt.
bryc 15/03/2015

4
Đây hiện là câu trả lời tốt nhất. Tất cả mọi thứ khác trong chủ đề này là thông tin sai lệch (!) Cảm ơn bạn đã dọn sạch tất cả những bài kiểm tra cũ xấu.
Bến

6
"InternalHTML sẽ không phá hủy trình xử lý sự kiện của bạn hoặc làm xáo trộn bất kỳ tài liệu tham khảo jquery nào" Nó sẽ mồ côi dữ liệu bị giữ jQuery.cache, gây rò rỉ bộ nhớ vì tham chiếu duy nhất có sẵn để quản lý dữ liệu đó là trên các phần tử bạn vừa hủy.

1
"InternalHTML sẽ không phá hủy trình xử lý sự kiện của bạn hoặc làm xáo trộn bất kỳ tài liệu tham khảo jquery nào" đề cập đến container, không phải cho trẻ em. cloneNodechuyển ra khỏi container, có nghĩa là các tham chiếu đến container không được duy trì (jquery hoặc cách khác). Bộ nhớ cache của Jquery có thể làm cho nó đáng để sử dụng jquery để xóa các thành phần nếu bạn có dữ liệu jquery được đính kèm với chúng. Hy vọng rằng họ chuyển sang WeakMaps tại một số điểm. Việc dọn dẹp (hoặc thậm chí là sự tồn tại của) $ .cache dường như không được ghi nhận chính thức.
npjohns

10
Các bài kiểm tra jsperf bị hỏng ở đây. Công cụ kiểm tra báo cáo như sau: "Lỗi: Các nút Dom không được tạo lại trong các lần lặp, kết quả kiểm tra sẽ vô nghĩa."
gửi

73

Sử dụng Javascript hiện đại, với remove!

const parent = document.getElementById("foo");
while (parent.firstChild) {
    parent.firstChild.remove();
}

Đây là một cách mới hơn để viết loại bỏ nút trong ES5. Đó là vani JS và đọc nhiều đẹp hơn phiên bản trước.

Hầu hết người dùng nên có trình duyệt hiện đại hoặc bạn có thể chuyển xuống nếu cần.

Hỗ trợ trình duyệt - 95% tháng 12 năm 2019


14
Vòng lặp for sẽ không hoạt động vì Parent.children / Parent.childNodes là danh sách trực tiếp; gọi remove sẽ sửa đổi danh sách và do đó trình lặp của bạn không được đảm bảo lặp đi lặp lại mọi thứ. Trong chrome, ví dụ, cuối cùng bạn bỏ qua mọi nút khác. Tốt hơn để sử dụng một while (parent.firstChild) { parent.removeChild(parent.firstChild); }vòng lặp. developer.mozilla.org/en-US/docs/Web/API/ParentNode/children developer.mozilla.org/en-US/docs/Web/API/Node/childNodes
qix

3
while (parent.firstChild && !parent.firstChild.remove());
Tốc

1
Một lớp lót khi hiệu suất không phải là một vấn đề lớn:[...parent.childNodes].forEach(el => el.remove());

1
Điều này không hoạt động trong Bản in ... thay vào đó hãy sử dụngwhile (selectElem.firstElementChild) { selectElem.firstElementChild.remove(); }
John Henckel

43
var myNode = document.getElementById("foo");
var fc = myNode.firstChild;

while( fc ) {
    myNode.removeChild( fc );
    fc = myNode.firstChild;
}

Nếu có bất kỳ cơ hội nào mà bạn có con cháu bị ảnh hưởng bởi jQuery, thì bạn phải sử dụng một số phương pháp sẽ dọn sạch dữ liệu jQuery.

$('#foo').empty();

.empty()Phương thức jQuery sẽ đảm bảo rằng mọi dữ liệu mà jQuery liên kết với các phần tử bị xóa sẽ được xóa sạch.

Nếu bạn chỉ đơn giản sử dụng DOMcác phương pháp loại bỏ trẻ em, dữ liệu đó sẽ vẫn còn.


Phương thức InternalHTML cho đến nay là hiệu quả nhất. Điều đó nói rằng, dữ liệu được dọn sạch bởi .empty (): jquery jquery, như sử dụng .onclick = .... Nếu bạn không có các sự kiện như vậy ở trẻ em bị xóa, thì cài đặt InternalHTML sẽ không bị rò rỉ. Vì vậy, câu trả lời tốt nhất là - nó phụ thuộc.
Chris Moschini

1
Tại sao không đặt biểu thức FirstChild trực tiếp trong điều kiện của vòng lặp while? while ( myNode.firstChild ) {
Victor Zamanian

while(fc = myNode.firstChild){ myNode.removeChild(fc); }
Valen

36

Nếu bạn sử dụng jQuery:

$('#foo').empty();

Nếu bạn không:

var foo = document.getElementById('foo');
while (foo.firstChild) foo.removeChild(foo.firstChild);

20

Nhanh nhất...

var removeChilds = function (node) {
    var last;
    while (last = node.lastChild) node.removeChild(last);
};

Cảm ơn Andrey Lushnikov vì đã liên kết đến jsperf.com (trang web tuyệt vời!).

EDIT: rõ ràng, không có sự khác biệt về hiệu suất trong Chrome giữa FirstChild và lastChild. Câu trả lời hàng đầu cho thấy một giải pháp tốt cho hiệu suất.


Điều tương tự không có cảnh báo LINT: clear: function (container) {for (;;) {var child = container.lastChild; nếu (! con) nghỉ; container.removeChild (con); }}
cskwg

9

Nếu bạn chỉ muốn có nút mà không có con của nó, bạn cũng có thể tạo một bản sao của nút như thế này:

var dupNode = document.getElementById("foo").cloneNode(false);

Phụ thuộc vào những gì bạn đang cố gắng để đạt được.


3
Có lẽ bạn thậm chí có thể làm theo điều này với parent.replaceChild(cloned, original)? Điều đó có thể nhanh hơn việc loại bỏ từng đứa trẻ một và nên hoạt động trên mọi thứ hỗ trợ DOM (vì vậy mọi loại tài liệu XML, bao gồm cả SVG). Đặt InternalHTML cũng có thể nhanh hơn loại bỏ từng cái một, nhưng điều đó không hiệu quả với bất cứ thứ gì ngoại trừ các tài liệu HTML. Nên kiểm tra một thời gian.
Maarten

13
Điều đó sẽ không sao chép trình nghe sự kiện được thêm bằng cách sử dụng addEventListener.
Matthew

Nếu bạn có thể sống với giới hạn đó, chắc chắn sẽ nhanh chóng: jsperf.com/innerhtml-vs-removechild/137
DanMan

7

Đây là một cách tiếp cận khác:

function removeAllChildren(theParent){

    // Create the Range object
    var rangeObj = new Range();

    // Select all of theParent's children
    rangeObj.selectNodeContents(theParent);

    // Delete everything that is selected
    rangeObj.deleteContents();
}

1
Điều này thật thú vị nhưng có vẻ khá chậm so với các phương pháp khác: jsperf.com/innerhtml-vs-removechild/256
Polaris878

6
element.textContent = '';

Nó giống như trong nội bộ, ngoại trừ tiêu chuẩn. Nó chậm hơn một chútremoveChild() , nhưng nó dễ sử dụng hơn và sẽ không tạo ra nhiều sự khác biệt về hiệu suất nếu bạn không có quá nhiều thứ để xóa.


Một nút văn bản không phải là một yếu tố
check_ca

xin lỗi bạn đúng, nó thực sự loại bỏ tất cả các yếu tố trẻ em
check_ca

Điều này sẽ không hoạt động trong các phiên bản cũ hơn của Internet Explorer.
pwdst

4

Đáp lại DanMan, Maarten và Matt. Nhân bản một nút, để đặt văn bản thực sự là một cách khả thi trong kết quả của tôi.

// @param {node} node
// @return {node} empty node
function removeAllChildrenFromNode (node) {
  var shell;
  // do not copy the contents
  shell = node.cloneNode(false);

  if (node.parentNode) {
    node.parentNode.replaceChild(shell, node);
  }

  return shell;
}

// use as such
var myNode = document.getElementById('foo');
myNode = removeAllChildrenFromNode( myNode );

Ngoài ra, điều này hoạt động cho các nút không nằm trong dom mà trả về null khi cố gắng truy cập vào ParentNode. Ngoài ra, nếu bạn cần an toàn, một nút trống trước khi thêm nội dung thì điều này thực sự hữu ích. Hãy xem xét trường hợp sử dụng bên dưới.

// @param {node} node
// @param {string|html} content
// @return {node} node with content only
function refreshContent (node, content) {
  var shell;
  // do not copy the contents
  shell = node.cloneNode(false);

  // use innerHTML or you preffered method
  // depending on what you need
  shell.innerHTML( content );

  if (node.parentNode) {
    node.parentNode.replaceChild(shell, node);
  }

  return shell;
}

// use as such
var myNode = document.getElementById('foo');
myNode = refreshContent( myNode );

Tôi thấy phương pháp này rất hữu ích khi thay thế một chuỗi bên trong một phần tử, nếu bạn không chắc nút đó sẽ chứa gì, thay vì lo lắng làm thế nào để dọn dẹp mớ hỗn độn, hãy bắt đầu làm mới.


3
điều tồi tệ nhất nếu bạn đang thay thế nút gốc bằng bản sao của nó, bạn sẽ mất tham chiếu đến nút gốc. không có xử lý sự kiện và các ràng buộc khác sẽ không hoạt động.
Arun Aravind

4

Đây là những gì tôi thường làm:

HTMLElement.prototype.empty = function() {
    while (this.firstChild) {
        this.removeChild(this.firstChild);
    }
}

Và voila, sau này bạn có thể làm trống bất kỳ phần tử dom nào với:

anyDom.empty()

Tôi thích giải pháp này! Bất kỳ lý do nào tôi nên sử dụng điều này hơn là thiết lập InternalHTML thành một chuỗi trống?
TheCodenator

hiệu suất: domEl.innerHTML = ""kém và được coi là thực hành tồi
Ado Ren


3
var empty_element = function (element) {

    var node = element;

    while (element.hasChildNodes()) {              // selected elem has children

        if (node.hasChildNodes()) {                // current node has children
            node = node.lastChild;                 // set current node to child
        }
        else {                                     // last child found
            console.log(node.nodeName);
            node = node.parentNode;                // set node to parent
            node.removeChild(node.lastChild);      // remove last node
        }
    }
}

Điều này sẽ loại bỏ tất cả các nút trong phần tử.


... bởi vì nó phức tạp không cần thiết và không có lời giải thích nào về cách thức hoạt động của nó (điều này thực sự không rõ ràng), tôi nghi ngờ.
Periata Breatta

2

InternalText là người chiến thắng! http://jsperf.com/innerhtml-vs-removechild/133 . Tại tất cả các thử nghiệm trước đó, dom bên trong của nút cha đã bị xóa ở lần lặp đầu tiên và sau đó bên trongHTML hoặc removeChild khi áp dụng cho div trống.


5
innerTextlà một điều MS độc quyền mặc dù. Chỉ cần nói.
DanMan

1
Khá chắc chắn rằng đây là một thử nghiệm thiếu sót - nó dựa vào boxviệc có sẵn không phải là một var mà thông qua tra cứu DOM dựa trên id, và vì whilevòng lặp này khiến cuộc gọi chậm này nhiều lần bị phạt.
nrabinowitz

2

Cách đơn giản nhất để loại bỏ các nút con của một nút thông qua Javascript

var myNode = document.getElementById("foo");
while(myNode.hasChildNodes())
{
   myNode.removeChild(myNode.lastChild);
}

2

tôi thấy mọi người đang làm:

while (el.firstNode) {
    el.removeChild(el.firstNode);
}

sau đó ai đó nói sử dụng el.lastNodenhanh hơn

tuy nhiên tôi sẽ nghĩ rằng đây là cách nhanh nhất:

var children = el.childNodes;
for (var i=children.length - 1; i>-1; i--) {
    el.removeNode(children[i]);
}

bạn nghĩ sao?

ps: chủ đề này là một cứu tinh cho tôi. addon firefox của tôi đã bị từ chối vì tôi đã sử dụng InternalHTML. Đó là một thói quen trong một thời gian dài. sau đó tôi foudn này. và tôi thực sự nhận thấy một sự khác biệt tốc độ. khi tải phần mềm inthtml mất một lúc để cập nhật, tuy nhiên, bằng cách thêm phần bổ sung ngay lập tức!


1
tôi nghĩ rằng liệu có nhanh nhất hay không, một số thử nghiệm jsperf có thể chứng minh một trong hai trường hợp
Nikos M.

siêu làm việc cảm ơn cho những bài kiểm tra. họ không bao gồm for (var i=0...một mặc dù. Nhưng đây là những gì tôi nhận được khi tôi chạy các thử nghiệm đó: i.imgur.com/Mn61AmI.png vì vậy trong ba thử nghiệm đó, FirstNode nhanh hơn
LastNode và InternalHTML

tôi đã thêm các bài kiểm tra: jsperf.com/innerhtml-vs-removechild/220 công cụ thú vị khi thực hiện phương pháp el.firstNode là cách nhanh nhất có vẻ như
Noitidart

2

Sử dụng một vòng lặp phạm vi cảm thấy tự nhiên nhất đối với tôi:

for (var child of node.childNodes) {
    child.remove();
}

Theo số đo của tôi trong Chrome và Firefox, nó chậm hơn khoảng 1,3 lần. Trong trường hợp bình thường, điều này có lẽ sẽ không quan trọng.


2
 let el = document.querySelector('#el');
 if (el.hasChildNodes()) {
      el.childNodes.forEach(child => el.removeChild(child));
 }

1
Hãy giải thích trong câu trả lời mã của bạn đang làm gì?
Nirav Joshi

1
Nó tự giải thích
blacksheep

1

Nói chung, JavaScript sử dụng mảng để tham chiếu danh sách các nút DOM. Vì vậy, điều này sẽ hoạt động tốt nếu bạn có hứng thú thực hiện nó thông qua mảng HTMLElements. Ngoài ra, đáng chú ý, bởi vì tôi đang sử dụng một tham chiếu mảng thay vì JavaScript proto, điều này sẽ hoạt động trong bất kỳ trình duyệt nào, kể cả IE.

while(nodeArray.length !== 0) {
  nodeArray[0].parentNode.removeChild(nodeArray[0]);
}

1

Tại sao chúng ta không làm theo phương pháp đơn giản nhất ở đây "loại bỏ" được lặp bên trong.

const foo = document.querySelector(".foo");
while (foo.firstChild) {
  foo.firstChild.remove();     
}
  • Chọn div cha
  • Sử dụng phương thức "remove" bên trong vòng lặp While để loại bỏ phần tử con đầu tiên, cho đến khi không còn phần nào.

Vui lòng giải thích các dòng mã của bạn để người dùng khác có thể hiểu chức năng của nó. Cảm ơn!
Ignacio Ara

@IgnacioAra Xong!
Neelansh Verma

1

Chỉ cần thấy ai đó đề cập đến câu hỏi này trong một câu hỏi khác và nghĩ rằng tôi sẽ thêm một phương pháp mà tôi chưa thấy:

function clear(el) {
    el.parentNode.replaceChild(el.cloneNode(false), el);
}

var myNode = document.getElementById("foo");
clear(myNode);

Hàm rõ ràng là lấy phần tử và sử dụng nút cha để thay thế chính nó bằng một bản sao mà không có phần tử con. Hiệu suất không tăng nhiều nếu phần tử thưa thớt nhưng khi phần tử có một loạt các nút thì hiệu suất đạt được được thực hiện.


1
Trên thực tế có vẻ như nó đã được đề cập ở đây stackoverflow.com/a/15441725/576767
Félix Gagnon-Grenier

Tôi chắc chắn đã bỏ lỡ điều đó, cảm ơn vì đã sửa +1.
Harry Chilinguerian

1

Phương pháp chỉ có chức năng:

const domChildren = (el) => Array.from(el.childNodes)
const domRemove = (el) => el.parentNode.removeChild(el)
const domEmpty = (el) => domChildren(el).map(domRemove)

"childNodes" trong domChildren sẽ cung cấp một nútList của các phần tử con ngay lập tức, trống khi không tìm thấy. Để ánh xạ qua nútList, domChildren chuyển đổi nó thành mảng. domEmpty ánh xạ một hàm domRemove trên tất cả các phần tử loại bỏ nó.

Ví dụ sử dụng:

domEmpty(document.body)

loại bỏ tất cả trẻ em khỏi các yếu tố cơ thể.


0

Các cách khác trong jQuery

var foo = $("#foo");
foo.children().remove();
//or
$("*", foo ).remove();
//or
foo.html("");
//or
foo.empty();

Bỏ phiếu xuống vì OP cho biết câu trả lời trong DOM thẳng được ưu tiên.
cơn gió

Ngoài ra, jQuery có .empty()phương thức, chỉ cần $("#foo").empty()là đủ
YakovL

-1

chỉ đơn giản là IE:

parentElement.removeNode(true);

true - có nghĩa là thực hiện loại bỏ sâu - có nghĩa là tất cả trẻ em cũng bị loại bỏ


1
I E? Đây là thế kỷ 21!
everlasto

-1

Cách dễ nhất:

let container = document.getElementById("containerId");
container.innerHTML = "";

Trong khi điều này hoạt động, hãy cẩn thận container.innerHTML = nullsẽ làm cho Internet Explorer hiển thị văn bản null. Vì vậy, điều này không thực sự loại bỏ trẻ em, tôi nói.
Arjan

-1

đơn giản và nhanh chóng sử dụng cho vòng lặp !!

var myNode = document.getElementById("foo");

    for(var i = myNode.childNodes.length - 1; i >= 0; --i) {
      myNode.removeChild(myNode.childNodes[i]);
    }

Điều này sẽ không hoạt động trong <span>thẻ!


trong tất cả các giải pháp, không có mã nào được gỡ bỏ <span>thẻ
Mohit Karkar

-3

Nếu bạn muốn đặt một cái gì đó trở lại vào đó div, innerHTMLcó lẽ tốt hơn.

Ví dụ của tôi:

<ul><div id="result"></div></ul>

<script>
  function displayHTML(result){
    var movieLink = document.createElement("li");
    var t = document.createTextNode(result.Title);
    movieLink.appendChild(t);
    outputDiv.appendChild(movieLink);
  }
</script>

Nếu tôi sử dụng .firstChildhoặc .lastChildphương thức thì displayHTML()hàm không hoạt động sau đó, nhưng không có vấn đề gì với .innerHTMLphương thức.


-4

Đây là một javascript thuần túy tôi không sử dụng jQuery nhưng hoạt động trong tất cả các trình duyệt ngay cả IE và nó rất đơn giản để hiểu

   <div id="my_div">
    <p>Paragraph one</p>
    <p>Paragraph two</p>
    <p>Paragraph three</p>
   </div>
   <button id ="my_button>Remove nodes ?</button>

   document.getElementById("my_button").addEventListener("click",function(){

  let parent_node =document.getElemetById("my_div"); //Div which contains paagraphs

  //Let find numbers of child inside the div then remove all
  for(var i =0; i < parent_node.childNodes.length; i++) {
     //To avoid a problem which may happen if there is no childNodes[i] 
     try{
       if(parent_node.childNodes[i]){
         parent_node.removeChild(parent_node.childNodes[i]);
       }
     }catch(e){
     }
  }

})

or you may simpli do this which is a quick way to do

document.getElementById("my_button").addEventListener("click",function(){

 let parent_node =document.getElemetById("my_div");
 parent_node.innerHTML ="";

})

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.