جافاسكريبت - إزالة عنصر بواسطة المعرف


عند إزالة عنصر باستخدام جافاسكريبت القياسية، يجب أن تذهب أولاً إلى العنصر الأب له:

var element = document.getElementById("element-id");
element.parentNode.removeChild(element);

يبدو لي أن الاضطرار للذهاب إلى العقدة الأصلية أولاً أمر غريب بعض الشيء، هل هناك سبب يجعل جافا سكريبت تعمل بهذه الطريقة؟

الإجابة رقم 1

أعلم أن تعزيز وظائف DOM الأصلية ليس دائمًا أفضل أو أكثر الحلول شيوعًا، لكن هذا يعمل بشكل جيد في المتصفحات الحديثة.

Element.prototype.remove = function() {
    this.parentElement.removeChild(this);
}
NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {
    for(var i = this.length - 1; i >= 0; i--) {
        if(this[i] && this[i].parentElement) {
            this[i].parentElement.removeChild(this[i]);
        }
    }
}

ومن ثم يمكنك إزالة العناصر مثل هذا

document.getElementById("my-element").remove();

أو

document.getElementsByClassName("my-elements").remove();

ملاحظة: هذا الحل لا يعمل مع IE 7 والإصدارات الأقدم. لمزيد من المعلومات حول توسيع DOM اقرأ هذا المقال.

تعديل: عند مراجعة إجابتي في عام 2019، جاءت node.remove() للإنقاذ ويمكن استخدامها كما يلي (بدون الإضافة أعلاه):

document.getElementById("my-element").remove();

أو

[...document.getElementsByClassName("my-elements")].map(n => n && n.remove());

هذه الوظائف متاحة في جميع المتصفحات الحديثة (ليس إنترنت إكسبلورر). اقرأ المزيد على MDN.

الإجابة رقم 2

متوافق مع جميع المتصفحات و IE الإصدار 11 فأحدث:

document.getElementById("element-id").outerHTML = "";

الإجابة رقم 3

يمكنك إنشاء دالة remove حتى لا تضطر للتفكير في ذلك كل مرة:

function removeElement(id) {
    var elem = document.getElementById(id);
    return elem.parentNode.removeChild(elem);
}

الإجابة رقم 4

تحديث 2011

تم إضافة هذا إلى مواصفة DOM في عام 2011، لذا يمكنك ببساطة استخدام:

element.remove()

يتم تنظيم DOM في شجرة من العقد، حيث تحتوي كل عقدة على قيمة، بالإضافة إلى قائمة بالمراجع لعقدها الفرعية. لذلك element.parentNode.removeChild(element) يحاكي بالضبط ما يحدث داخليًا: أولاً تذهب إلى العقدة الأم، ثم تزيل المرجع إلى العقدة الفرعية.

اعتبارًا من DOM4، يتم توفير دالة مساعدة للقيام بنفس الشيء: element.remove(). هذا يعمل في 96٪ من المتصفحات (اعتبارًا من 2020)، ولكن ليس في IE 11.

إذا كنت بحاجة إلى دعم المتصفحات الأقدم، يمكنك:

  • إزالة العناصر عبر العنصر الأب
  • تعديل وظائف DOM الأصلية، كما في جواب يوهان ديتمار، أو
  • استخدم مكمّل DOM4.

الإجابة رقم 5

هذا ما يدعمه DOM. ابحث في تلك الصفحة عن "remove" أو "delete" وremoveChild هو الوحيد الذي يزيل العقدة.

الإجابة رقم 6

لإزالة عنصر واحد:

 var elem = document.getElementById("yourid");
 elem.parentElement.removeChild(elem);

لإزالة جميع العناصر التي على سبيل المثال تحمل اسم فئة معين:

 var list = document.getElementsByClassName("yourclassname");
 for(var i = list.length - 1; 0 <= i; i--)
 if(list[i] && list[i].parentElement)
 list[i].parentElement.removeChild(list[i]);

الإجابة رقم 7

يمكنك ببساطة استخدام element.remove()

الإجابة رقم 8

يمكنك إزالة هذا العنصر مباشرة باستخدام طريقة remove() في DOM.

إليك مثال:

let subsWrapper = document.getElementById("element_id");
subsWrapper.remove();
//OR directly.
document.getElementById("element_id").remove();

الإجابة رقم 9

تقوم الطريقة ChildNode.remove() بإزالة الكائن من الشجرة التي ينتمي إليها.

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

إليك مثالًا يوضح كيفية استدعاء document.getElementById('my-id').remove()

https://jsfiddle.net/52kp584L/

**

لا حاجة لتمديد NodeList. لقد تم تنفيذها بالفعل.

**

الإجابة رقم 10

وفقًا لمواصفات DOM المستوى 4، وهي النسخة الحالية قيد التطوير، هناك بعض طرق التحوير الجديدة المفيدة المتوفرة: append()، prepend()، before()، after()، replace()، و remove().

https://catalin.red/removing-an-element-with-plain-javascript-remove-method/