لماذا تحتاج RemoveChild إلى عقدة الوالدين؟
-
26-09-2019 - |
سؤال
بعد الرد هذا السؤال لقد تركت أتساءل لماذا removeChild
يحتاج إلى عنصر الوالدين. بعد كل شيء ، يمكننا ببساطة القيام به
node.parentNode.removeChild(node);
نظرًا لأن العقدة الأصل يجب أن تكون متاحة مباشرة لمحرك JavaScript/DOM ، فليس من الضروري تمامًا توفير العقدة الأصل للعقدة التي سيتم إزالتها.
بالطبع أفهم مبدأ ذلك removeChild
هي طريقة لعقدة DOM ، ولكن لماذا لا يشبه شيء document.removeNode
موجود (وهذا يقبل مجرد عقدة تعسفية كمعلمة)؟
تعديل: لكي نكون أكثر وضوحًا ، فإن السؤال هو: لماذا يحتاج محرك JS إلى العقدة الأصل على الإطلاق ، إذا كان لديه بالفعل العقدة (الفريدة) التي سيتم إزالتها؟
المحلول
أعتقد أنه يحافظ على التصميم بسيط. الأنود مايو موجودة في عزلة ولكن الحالة الأكثر إثارة للاهتمام هي شجرة دوم. مع removeChild
, ، يجب أن تكون العقدة المراد إزالتها طفلًا في العقدة التي تم استدعاء الطريقة.
إن الحصول على قائمة بجميع الأطفال وإجراء مقارنة يدوية مع كل منهم ليس عملية باهظة الثمن. ومع ذلك ، فإن البحث في جميع أحفاد العقدة التي سيتم إزالتها مكلفة بالفعل.
يحرر: استجابةً للتحديث الخاص بك ، يقوم المتصفح ببساطة بتنفيذ مواصفات DOM, ، الذي يحدد أ removeChild
طريقة على Node
. المواصفات ، فى رايى, ، يجب أن تكون لا لبس فيها وخالية من الافتراضات. انه ايضا مشابه حقن التبعية من هذا المنظور. تقوم DOM Core Spec بتطوير شجرة باستخدام لبنات البناء مثل العقدة والعنصر وما إلى ذلك. إضافة طريقة وحيدة مثل removeNode
في مكان ما في لبنات البناء هذه يعني أن الطريقة لها معرفة ضمنية ببيئتها - أنها may
كن طفلاً في بعض العقدة ، ويجب إزالته من هناك إذا كان كذلك.
مهمة W3 هي جعل واجهة برمجة تطبيقات قوية للغاية مما يجعل معظم الأشياء ممكنة. لا ينبغي أن يقلقوا بشأن السكر النحوي لأنه يمكن دائمًا كتابته حول واجهات برمجة التطبيقات الأصلية إذا كانت مكتوبة جيدًا.
نصائح أخرى
قد يكون الارتباك لأنك قد تعتقد أن إزالة عنصر ما يعني شيئًا مثل قتله أو تدميره.
ولكن في الواقع ، مفهوم إزالة يعني في الأساس كسر العلاقة بين الطفل ووالده. انها مجرد مفرزة.
لذلك ، فإن إزالة العنصر الذي ليس له عقدة الوالدين لا معنى له. ومن المعقول أنه إذا كنت ترغب في كسر هذه العلاقة بين أحد الوالدين والطفل ، فأنت بحاجة إلى إشارة إلى كليهما.
ومع ذلك ، فمن الصحيح أنك في بعض الأحيان تريد فقط إزالة طفل من والديه ، دون الاهتمام بهذا الوالد على الإطلاق. لهذا السبب يقدم DOM المستوى 4 ChildNode
الواجهة ، التي توفر remove
طريقة.
يتم تنفيذ تلك الواجهة بواسطة DocumentType
, Element
و CharacterData
, ، حتى تتمكن من استخدامه على Doctypes, عناصر و Text
, Comment
, ، و ProcessingInstruction
العقد.
على افتراض node
هو واحد من هذه ، يمكنك استخدام
node.remove();
في حالة عدم وجود عقدة أولية بالفعل ، لا شيء يحدث.