ستتم إزالة أحداث التغيير من Chrome.

الإعلان عن الإيقاف النهائي وأحداث التغيير المخطَّط لها، ومشاركة كيفية نقل الرموز البرمجية قبل الإزالة في تموز (يوليو) 2024

Mason Freed
Mason Freed

أوقِف Chromium نهائيًا أحداث التغيير، ويتطلّب إيقاف توفُّر الإصدار 127 بدلاً من الإصدار 127 الذي سينتقل إلى الإصدار الثابت في 23 تموز (يوليو) 2024. توضّح هذه المشاركة سبب إزالة أحداث التبديل، وتقدِّم مسارًا لنقل البيانات قبل إزالتها من المتصفِّح.

ما هي أحداث الطفرة؟

أحداث التغيير هي اسم المجموعة التالية من الأحداث:

  • DOMNodeInserted
  • DOMNodeRemoved
  • DOMSubtreeModified
  • DOMCharacterDataModified
  • DOMNodeInsertedIntoDocument
  • DOMNodeRemovedFromDocument
  • (لا يدعمه أي متصفح حديث) DOMAttrModified
  • (لا يدعمه أي متصفح حديث) DOMAttributeNameChanged
  • (لا يدعمه أي متصفح حديث) DOMElementNameChanged

هذه الأحداث هي جزء قديم جدًا من مواصفات المستوى 2 من نموذج العناصر في المستند (DOM)، وتم إيقافها نهائيًا منذ 2011. وقد تم استبدالها بـ واجهة MutationMonitorer التي أصبحت متوافقة مع جميع المتصفّحات الحديثة منذ عام 2013.

سجلّ أحداث الطفرة

بدت أحداث التغيُّرات كفكرة جيدة منذ فترة طويلة، ولكن اتضح أنها تتضمّن العديد من العيوب الفادحة:

  • تكون مطولة جدًا وحريقة كثيرًا. يتم تنشيط الحدث لكل عقدة تتم إزالتها.
  • وهي بطيئة بسبب نشر الأحداث لأنّها تمنع إجراء العديد من التحسينات على وقت تشغيل Universal Analytics.
  • غالبًا ما تتسبب هذه الأعطال في حدوث أعطال. لقد كانت هذه البيانات مصدرًا للعديد من الأعطال وأخطاء الأمان في المتصفحات، لأن أدوات معالجة الأحداث يمكنها تغيير DOM بالكامل تحت عملية DOM قيد التشغيل.

وبسبب هذه العيوب، تم إيقاف الأحداث من المواصفات في عام 2011، وتم إنشاء واجهة برمجة تطبيقات بديلة (MutationObserver) في عام 2012. وقد تم تنفيذ واجهة برمجة التطبيقات الجديدة وهي تعمل لأكثر من 10 سنوات حتى الآن.

أسباب إزالة أحداث التغييرات

يختلف دعم أحداث التغيير باختلاف المتصفِّحات. لا تتوافق بعض الأحداث، مثل DOMNodeInsertedIntoDocument وDOMNodeRemovedFromDocument، مع بعض المتصفّحات. وبالنسبة إلى الأحداث الأخرى، يختلف السلوك المحدّد بسبب عدم توفّر أي مواصفات متفق عليها. ومع ذلك، قد يكون السؤال المعقول: لمَ لا تتركها هناك، بما أنها "مكتملة" وتعمل على إبطاء الصفحات التي تستخدمها فقط؟ تأتي الإجابة في جزأين.

أولاً، تؤدي هذه الفعاليات إلى حجب المنصة على الويب. ومع تطوّر الويب وإضافة واجهات برمجة تطبيقات جديدة، يجب وضع هذه الواجهات القديمة في الاعتبار. في بعض الأحيان، قد تؤدي الحاجة فقط إلى دعم هذه الأحداث إلى منع اقتراح واجهات برمجة تطبيقات جديدة. على سبيل المثال، تم تقديم طلب طويل الأمد لمنع إعادة تحميل عناصر <iframe> عند نقلها داخل نموذج العناصر في المستند (DOM). ومع ذلك، وبسبب وجود أحداث الطفرة، اعتبر أنّ هذا الجهد كان من الصعب جدًا تحقيقه، وتم إغلاق الطلب.

لا تزال هذه الأحداث تقف عائقًا أمام زيادة سرعة المتصفِّحات. حتى مع التحسينات التي تجريها المتصفّحات، والتي تحاول تجنُّب العقوبات المفروضة على الأداء على الصفحات التي لا تستخدم أحداث التبديل، لا تكون الأمور مثالية. لا يزال يجب إجراء عمليات التحقّق في العديد من الأماكن لمستمعي "حدث التبديل". لا يزال من الضروري كتابة الرمز البرمجي بشكل دفاعي، لأنّ هذه الأحداث قد تؤدي إلى تغيير نموذج العناصر في المستند (DOM) بطرق مدهشة.

وبعد مرور أكثر من 10 أعوام على الإيقاف النهائي للأحداث، وتوفّر واجهة برمجة التطبيقات البديلة على نحو مماثل لأكثر من 10 سنوات، حان الوقت لإزالة أحداث التبديل نهائيًا من المتصفِّحات مرة واحدة وإلى الأبد.

كيفية نقل البيانات

استخدام MutationObserver كبديل

إنّ المستندات الخاصة بـ MutationObserver متوفّرة في MDN، وهي كاملة إلى حدّ ما. يعتمد استبدال قاعدة الرموز على كيفية استخدام هذه الأحداث، ولكن على سبيل المثال:

// Old mutation event usage:  
target.addEventListener(‘DOMNodeInserted',event => doSomething(event.target));

// Replacement mutation observer code:  
const observer = new MutationObserver(mutationList =>  
  mutationList.filter(m => m.type === 'childList').forEach(m => {  
    m.addedNodes.forEach(doSomething);  
  }));  
observer.observe(target,{childList: true, subtree: true});  

على الرغم من أنّ رمز MutationObserver يظهر أكبر من رمز المستمع إلى حدث DOMNodeInserted الأصلي، يمكن ملاحظة أنّه يمكنه معالجة جميع التغييرات التي تحدث على شجرة كاملة في استدعاء واحد، بدلاً من طلب استدعاءات متعددة لمعالِج الأحداث.

الملء التلقائي

هناك رمز polyfill يحاول السماح بالرمز الحالي بمواصلة العمل مع توفُّره من خلال MutationObserver. يوجد polyfill على GitHub أو كحزمة npm.

معلومات عن الفترة التجريبية للمخطط الزمني والإيقاف النهائي

ستتم إزالة أحداث التغيير من Chrome 127 لجميع المستخدمين*، والتي ستنتقل إلى الإصدار الثابت في 23 تموز (يوليو) 2024. سنبدأ بإزالة الأحداث قبل ذلك من قنوات إصدار Canary وDev وقنوات الإصدارات التجريبية، وذلك كتحذير مبكر.

  • إذا كنت بحاجة إلى وقت إضافي (بعد تموز/يوليو 2024) لنقل الرموز البرمجية، يمكنك الاستفادة من فترة تجريبية لإيقاف الميزة تعيد تفعيل الأحداث مؤقتًا في مواقع إلكترونية محدّدة. وتتوفّر أيضًا سياسة Enterprise تُسمى MutationEventsEnabled تعمل بالطريقة نفسها لمستخدمي الإصدار الخاص بالمؤسسات. ويمنح أي من هذين الخيارين حوالي تسعة أشهر إضافية للنقل، إذا لزم الأمر.