2010-08-06 6 views
13

Sau khi trả lời this question Tôi đang tự hỏi tại sao removeChild cần một phần tử gốc. Sau khi tất cả, chúng tôi chỉ có thể làmTại sao removeChild cần một nút cha?

node.parentNode.removeChild(node); 

Vì nút cha phải luôn có sẵn trực tiếp cho công cụ Javascript/DOM, không cần thiết phải cung cấp nút cha của nút cần xóa.

Tất nhiên tôi hiểu nguyên tắc removeChild là một phương thức của nút DOM, nhưng tại sao không có thứ gì đó như document.removeNode tồn tại (chỉ đơn thuần chấp nhận một nút tùy ý làm tham số)?

EDIT: Để rõ ràng hơn, câu hỏi đặt ra là: tại sao công cụ JS cần nút gốc ở tất cả, nếu nó đã có nút (duy nhất) cần xóa?

+1

DOM là một khái niệm hướng đối tượng. Điều đó có nghĩa là nó sẽ có ý nghĩa hơn nếu 'Node.prototype.remove' sẽ tồn tại để loại bỏ các nút chính nó hơn nếu' Document.prototype.removeNode' sẽ tồn tại để loại bỏ một nút từ tài liệu. Bởi vì sau này sẽ được thực hiện đơn giản bằng cách gọi 'removeChild' trên nút cha của nút. – Gumbo

Trả lời

7

Tôi nghĩ nó giữ thiết kế đơn giản. Một nút có thể tồn tại độc lập nhưng trường hợp thú vị hơn là cây DOM. Với removeChild, nút cần xóa phải là nút con của nút mà phương thức được gọi.

Lấy danh sách tất cả trẻ em và so sánh thủ công với mỗi trẻ em không phải là một hoạt động tốn kém. Tuy nhiên, tìm kiếm tất cả các con cháu cho một nút được loại bỏ thực sự là tốn kém.

Sửa: Để đối phó với cập nhật của bạn, một trình duyệt chỉ đơn giản là thực hiện DOM spec, trong đó xác định một phương pháp removeChild trên Node. Thông số, theo ý kiến ​​của tôi, phải rõ ràng và không có giả định. Nó tương tự như Dependency Injection từ quan điểm đó. Đặc tả DOM Core mô hình hóa một cây bằng cách sử dụng các khối xây dựng như Nút, Phần tử, v.v. Thêm một phương thức đơn lẻ như removeNode ở đâu đó trong các khối xây dựng này có nghĩa là phương pháp này có kiến ​​thức tiềm ẩn về môi trường của nó - may là con của một số nút, và nó phải được loại bỏ khỏi đó nếu có.

Nhiệm vụ của w3 là tạo một API rất mạnh mẽ, tạo ra hầu hết mọi thứ có thể. Họ không nên lo lắng về đường cú pháp vì nó luôn có thể được viết xung quanh các API gốc nếu chúng được viết tốt.

+0

+1 Đó là giải thích tốt hơn/đúng tôi nghĩ. – Sarfraz

+0

Chỉ cần một lưu ý phụ nữa: Diego Perini [đã nói] (http://twitter.com/diegoperini/status/20580063920) rằng IE và Opera thực sự hỗ trợ ['removeNode'] (http://msdn.microsoft.com/ phương pháp en-us/library/ms536708% 28VS.85% 29.aspx). –

1

Sự nhầm lẫn có thể là do bạn có thể nghĩ rằng việc xóa một phần tử có nghĩa là một cái gì đó như giết chết hoặc phá hủy nó.

enter image description here

Nhưng trên thực tế, khái niệm về removal về cơ bản có nghĩa là phá vỡ mối quan hệ giữa một đứa trẻ và cha mẹ của nó. Nó chỉ là một đội.

enter image description here

Do đó, loại bỏ một yếu tố mà không có nút cha làm cho không có ý nghĩa. Và đó là hợp lý rằng, nếu bạn muốn phá vỡ kết nối đó giữa một phụ huynh và một đứa trẻ, bạn cần một tham chiếu đến cả hai.

Điều đó nói rằng, đôi khi bạn chỉ muốn xóa một đứa trẻ khỏi cha mẹ, mà không cần quan tâm đến bố mẹ đó. Đó là lý do DOM Level 4 giới thiệu giao diện ChildNode, cung cấp phương thức remove.

Đó giao diện được thực hiện bởi DocumentType, ElementCharacterData, vì vậy bạn có thể sử dụng nó trên doctypes, elementsText, Comment, và ProcessingInstructionnodes.

Giả sử node là một trong số này, bạn có thể sử dụng

node.remove(); 

Trong trường hợp nó đã không có nút cha, không có gì xảy ra.