2011-03-04 29 views

Trả lời

14

Phương thức removeChild chỉ đơn giản là xóa nó khỏi cha mẹ của nó. Nếu đó là phần tử hiển thị của trang, phần tử đó sẽ bị xóa khỏi trang.

Nhưng Javascript có bộ sưu tập rác. Điều này có nghĩa là chính đối tượng nút sẽ vẫn tồn tại miễn là bất kỳ biến nào đề cập đến nó. Vì vậy, bạn có thể gán một nút cho một biến, sử dụng removeChild để 'prune' nó từ nút cha của nó, và sau này, chèn hoặc nối nó vào một số nút khác, do đó có hiệu quả di chuyển nó xung quanh trên trang.

Các mã sau đây sẽ loại bỏ một nút, và chờ 10 giây trước khi tái thêm nó vào cây (và do đó, để trang):

var oldNode = someNode.removeChild(...); 
setTimeout(function() { 
    document.documentElement.appendChild(oldNode); 
}, 10000); 

Điều này có nghĩa rằng đối tượng nút vẫn chưa được bị xóa khỏi bộ nhớ, bởi vì vẫn còn một biến trỏ đến nó (cụ thể là, oldNode).

Một trường hợp khác:

var node = document.getElementById('test'); 
// ... do stuff 
node.parentElement.removeChild(node); 
// 'node' still exists, but has been removed from the page 
// ... do some more stuff 
node = document.getElementById('hello'); 
// The variable 'node' now points to something else; 
// this means the original node will be deleted from memory 

Nếu, mặt khác, bạn không gán nút gỡ bỏ để biến khác, nó không thể được truy cập nữa (không thông qua cây tài liệu, kể từ nó đã bị xóa khỏi đó, và không phải thông qua biến JS); nên javascript sẽ tự động tẩy nó từ bộ nhớ:

someNode.removeChild(...); 

Gán nút gỡ bỏ cho một biến, và sau đó gán null (hoặc bất cứ điều gì khác) để biến đó - như Marc B gợi ý trong câu trả lời của ông - là hoàn toàn không cần thiết và, IMHO, ngớ ngẩn.

1

removeChild xóa phần tử khỏi dom, nhưng nó cũng được trả lại từ hàm trong trường hợp bạn đang thực hiện việc xóa để chèn lại nó ở nơi khác. Bạn sẽ phải giết mà giá trị trả về để thực sự thoát khỏi nút loại bỏ:

oldNode = someNode.removeChild(...); 
oldNode = null; 
+0

Oh cảm ơn bạn :) –

+5

Sẽ không đơn giản là không gán giá trị trả lại cho bất kỳ thứ gì có cùng tác dụng? – awm

+1

Null của tiện lợi và làm cho nó rõ ràng bạn đang trashing giá trị. làm 'oldNode = 'xóa nút này, vui lòng';' có vẻ như là một sự lãng phí của các ký tự. –

10

này hoàn toàn sẽ xóa các nút:

someNode.removeChild(...); 

này sẽ loại bỏ các nút từ DOM vì vậy nó không hiển thị nhưng sẽ lưu nó để bạn có thể chèn nó ở nơi khác:

oldNode = someNode.removeChild(...); 
+1

Ví dụ đầu tiên là chính xác, nhưng tôi đã có một tình huống mà nó dường như không hoạt động, ví dụ:'var aChild = document.createElement (...); someNode.appendChild (aChild); ... someNode.removeChild (aChild); Nút vẫn còn do tham chiếu biến aChild. Trong trường hợp đó, bạn cần phải 'xóa aChild' để hoàn thành công việc. – CyberFonic

+0

Từ ngữ cảnh khác (nơi bạn có thể không biết liệu có các tham chiếu khác tới nút đã xóa) hay không, bạn có thể kiểm tra xem trạng thái mà nút đã xóa nằm trong 'node.parentElement == null' –

+0

. các tham chiếu khác tới nút. Có nghĩa là nếu nút được tham chiếu ở nơi khác 'removeChild' sẽ không xóa hoàn toàn nút đó. –

1

Nếu bạn thực sự muốn xóa phần tử dom. removeChild một mình là không đủ. Đây là theo Steve Sounders, tác giả của YSlow. Bạn cần phải sử dụng xóa

Các vấn đề liên quan