2010-08-06 109 views
13

應答後this question我在想,爲什麼removeChild需要父元素。畢竟,我們可以簡單地做爲什麼removeChild需要父節點?

node.parentNode.removeChild(node); 

由於父節點應該總是直接提供給Javascript/DOM引擎,它不是嚴格需要提供所要刪除的節點的父節點。

當然我明白removeChild是DOM節點的方法,但爲什麼不存在像document.removeNode這樣的東西(它只接受任意節點作爲參數)?

編輯:爲了更清楚,問題是:爲什麼JS引擎完全需要父節點,如果它已經有要刪除的(唯一)節點?

+1

DOM是一個面向對象的概念。這意味着,如果存在'Node.prototype.remove'來移除節點本身比存在'Document.prototype.removeNode'來移除文檔中的節點更有意義。因爲後者只需通過調用節點父節點上的'removeChild'來實現。 – Gumbo 2010-08-06 09:29:58

回答

7

我認爲它保持了簡單的設計。節點可能孤立存在,但更有趣的情況是DOM樹。使用removeChild,要刪除的節點必須是調用該方法的節點的子節點。

獲取所有孩子的列表並對每個孩子進行手動比較並不是那麼昂貴的一項操作。但是,搜索所有後代以找到要刪除的節點的確很昂貴。

編輯:在回答你的更新,瀏覽器簡單地實現DOM spec,它定義了一個Node方法removeChild。在我看來,的規範必須是明確的,並且沒有任何假設。從這個角度來看,它類似於Dependency Injection。 DOM核心規範使用諸如節點,元素等構建塊對樹進行建模。在這些構建塊中的某處添加諸如removeNode等孤立方法意味着該方法具有關於其環境的隱含知識 - 它是某個節點的子節點,如果是的話,它應該從那裏刪除。

W3的任務是製作一個非常強大的API,它使大多數事情成爲可能。他們不應該擔心語法糖,因爲如果寫得很好的話,它總是可以在本地API上編寫。

+0

+1這是我認爲的更好/正確的解釋。 – Sarfraz 2010-08-06 09:27:44

+0

只有一個方面說明:迭戈佩里尼[說](http://twitter.com/diegoperini/status/20580063920)IE和Opera實際上支持['removeNode'](http://msdn.microsoft.com/ en-us/library/ms536708%28VS.85%29.aspx)方法。 – 2010-08-10 12:43:10

1

混淆可能是因爲你可能認爲刪除元素意味着殺死或摧毀它。

enter image description here

但事實上,removal概念基本上意味着打破一個小孩子與其父之間的關係。這只是一個分隊。

enter image description here

因此,去除不具有父節點的元件是沒有意義的。如果你想打破父母和孩子之間的聯繫,那麼你需要對兩者都有一個參考,這是合理的。

這就是說,有時候你只是想從孩子的父母身上移除一個孩子,而不關心那個父母。這就是DOM Level 4引入ChildNode接口的原因,該接口提供了remove方法。

這個接口是由DocumentTypeElementCharacterData實施,這樣你就可以doctypeselementsTextCommentProcessingInstructionnodes使用它。

假設node是其中之一,你可以使用

node.remove(); 

在情況下,它已經沒有父節點,沒有任何反應。