2010-08-06 10 views
13

this question का उत्तर देने के बाद मुझे आश्चर्य हुआ कि removeChild को मूल तत्व की आवश्यकता क्यों है। सब के बाद, हम बसRemChild को पैरेंट नोड की आवश्यकता क्यों है?

node.parentNode.removeChild(node); 

कर सकता है माता पिता नोड हमेशा होना चाहिए के रूप में सीधे जावास्क्रिप्ट/डोम इंजन के लिए उपलब्ध है, है न अत्यंत आवश्यक होता नोड हटा दिया जाना चाहिए यह है कि माता-पिता की नोड आपूर्ति है।

बेशक मैं सिद्धांत को समझता हूं कि removeChild एक डोम नोड का एक तरीका है, लेकिन document.removeNode जैसे कुछ क्यों नहीं है (जो पैरामीटर के रूप में केवल मनमानी नोड स्वीकार करता है)?

संपादित करें: अधिक स्पष्ट होने के लिए, सवाल यह है कि: जेएस इंजन को पैरेंट नोड की आवश्यकता क्यों है, अगर उसके पास पहले से ही (अद्वितीय) नोड निकाला जा सकता है?

+1

डीओएम एक ऑब्जेक्ट उन्मुख अवधारणा है। इसका अर्थ यह है कि यदि दस्तावेज़ से नोड को निकालने के लिए 'Document.prototype.removeNode' मौजूद होगा, तो नोड को हटाने के लिए 'Node.prototype.remove' मौजूद होगा, तो यह अधिक समझ में आएगा। क्योंकि बाद वाले को नोड के माता-पिता पर 'removeChild' को कॉल करके कार्यान्वित किया जाएगा। – Gumbo

उत्तर

7

मुझे लगता है कि यह डिज़ाइन को सरल रखता है। एक नोड अलगाव में मौजूद हो सकता है लेकिन अधिक दिलचस्प मामला डोम पेड़ है। removeChild के साथ, हटाया जाने वाला नोड उस नोड का बच्चा होना चाहिए जिस पर विधि को बुलाया गया था।

सभी बच्चों की एक सूची प्राप्त करना और प्रत्येक के खिलाफ मैन्युअल तुलना करना महंगा नहीं है। हालांकि, हटाए जाने वाले नोड के लिए सभी वंशजों को खोजना वास्तव में महंगा है।

संपादित: अगर आपके अपडेट के जवाब में, एक ब्राउज़र बस DOM spec, जो Node पर एक removeChild पद्धति निर्धारित करता है लागू कर रहा है। मेरी राय में spec, , स्पष्ट और मान्यताओं से मुक्त होना चाहिए। यह उस परिप्रेक्ष्य से Dependency Injection के समान है। डीओएम कोर स्पेक नोड, एलिमेंट इत्यादि जैसे बिल्डिंग ब्लॉक का उपयोग करके एक पेड़ का मॉडल करता है। इन बिल्डिंग ब्लॉक में कहीं भी removeNode जैसी एकमात्र विधि जोड़ना मतलब है कि विधि के पर्यावरण के बारे में जानकारी है - यह may कुछ नोड का बच्चा बनें, और अगर वहां है तो इसे हटा दिया जाना चाहिए।

डब्ल्यू 3 का कार्य एक बहुत ही मजबूत एपीआई बनाना है जो अधिकतर चीजों को संभव बनाता है। उन्हें सिंटेक्टिक चीनी के बारे में चिंता नहीं करनी चाहिए क्योंकि अगर वे अच्छी तरह से लिखे गए हैं तो हमेशा देशी एपीआई के आसपास लिखा जा सकता है।

+0

+1 यह मुझे लगता है कि बेहतर/सही स्पष्टीकरण है। – Sarfraz

+0

बस एक और पक्ष नोट: डिएगो पेरिनी [कहा] (http://twitter.com/diegoperini/status/20580063920) कि आईई और ओपेरा वास्तव में एक ['removeNode'] का समर्थन करता है (http://msdn.microsoft.com/ एन-यूएस/लाइब्रेरी/एमएस 536708% 28VS.85% 29.aspx) विधि। –

1

भ्रम हो सकता है क्योंकि आप सोच सकते हैं कि तत्व को हटाने का मतलब है कि इसे मारना या नष्ट करना।

enter image description here

लेकिन वास्तव में, removal की अवधारणा मूल रूप से एक बच्चे और उसकी मूल के बीच संबंधों को तोड़ने का मतलब है। यह सिर्फ एक अलगाव है।

enter image description here

इसलिए, एक तत्व है जो कोई माता पिता नोड है को हटाने के कोई मतलब नहीं है। और यह उचित है कि, यदि आप माता-पिता और बच्चे के बीच उस कनेक्शन को तोड़ना चाहते हैं, तो आपको दोनों के संदर्भ की आवश्यकता है।

यह कहा गया है कि, यह सच है कि कभी-कभी आप उस माता-पिता की देखभाल किए बिना अपने माता-पिता से बच्चे को हटाना चाहते हैं। यही कारण है कि डोम लेवल 4 ChildNode इंटरफेस पेश करता है, जो remove विधि प्रदान करता है।

ताकि आप doctypes, elements और Text, Comment, और ProcessingInstructionnodes पर इसका इस्तेमाल कर सकते हैं इंटरफेस, DocumentType, Element और CharacterData द्वारा कार्यान्वित किया जाता है।

node मान लिया जाये कि इन में से एक है, तो आप

node.remove(); 

उपयोग कर सकते हैं मामले में यह पहले से ही कोई माता पिता नोड है, कुछ नहीं होता।

संबंधित मुद्दे