البرمجة

تحديث تكوين MutationObserver للاكتشاف الصحيح لتغييرات textContent

عند استخدام MutationObserver في السيناريو الذي وصفته، يبدو أنه لا يكتشف التغييرات التي تتم باستخدام خاصية textContent. على الرغم من أن النص الذي يظهر في العنصر يتغير، إلا أن الكود لا يستجيب لهذه التغييرات. هذا يعود إلى طبيعة عمل MutationObserver وكيفية اكتشافه للتغييرات.

MutationObserver هو واحد من ميزات واجهة مراقبة التغييرات (MutationObserver API) التي توفرها HTML Living Standard. يتيح هذا الأداة رصد التغييرات التي تطرأ على العناصر في الصفحة وتنفيذ إجراءات محددة عند حدوث هذه التغييرات. ومع ذلك، هناك بعض الاختلافات في كيفية اكتشاف التغييرات اعتمادًا على نوع التغيير الذي يتم.

عندما يتم استخدام خاصية textContent لتغيير النص داخل العنصر، فإن هذا التغيير يعتبر تغييرًا في البيانات النصية (characterData) داخل العنصر. ومع ذلك، الكود الذي كتبته يستخدم MutationObserver مع تكوين يحدد أنه يتعين على المراقب اكتشاف تغييرات في البيانات النصية (characterData: true)، لكنه يحدد أيضًا أنه يجب تعطيل اكتشاف التغييرات في عناصر الأطفال (childList: false) والسمات (attributes: false). هذا يعني أن المراقب لن يكتشف التغييرات التي تتم داخل العنصر نفسه، بل سيتم التركيز فقط على تغييرات السمات وبيانات النص خارج العنصر.

بالتالي، عندما يتم استخدام خاصية innerHTML لتغيير النص داخل العنصر، فإن هذا التغيير يؤدي إلى تغيير في العنصر نفسه، وليس فقط في بيانات النص. وبالتالي، يتم اكتشاف هذا التغيير بشكل صحيح من قبل MutationObserver ويتم تنفيذ الإجراء المحدد (في هذه الحالة، إرسال تنبيه).

لحل هذه المشكلة وجعل MutationObserver يكتشف تغييرات textContent، يجب تعديل تكوين المراقب لتمكين childList لتغييرات العنصر نفسه. يمكنك تغيير السطر:

javascript
var config = { characterData: true, attributes: false, childList: false, subtree: true };

إلى:

javascript
var config = { characterData: true, attributes: false, childList: true, subtree: true };

بهذا التعديل، سيقوم المراقب بالآن بتتبع التغييرات في البيانات النصية داخل العنصر وسيكتشف التغييرات التي تتم باستخدام textContent بنجاح.

المزيد من المعلومات

بالتأكيد، سنكمل المقال بمزيد من التفاصيل والشروحات حول MutationObserver وكيفية استخدامه بشكل أكثر فعالية.

عند استخدام MutationObserver، من المهم فهم الاختلافات بين خيارات التكوين المختلفة وكيفية تأثيرها على اكتشاف التغييرات. لنلقِ نظرة أكثر عمقًا على كل خيار في تكوين المراقب:

  1. characterData: يحدد ما إذا كان يجب على المراقب اكتشاف تغييرات في بيانات النص (مثل textContent أو nodeValue) داخل العنصر المستهدف. عند تعيين هذا الخيار إلى true، يعني أن التغييرات في النص داخل العنصر ستكتشف.

  2. attributes: يحدد ما إذا كان يجب على المراقب اكتشاف تغييرات في السمات (attributes) للعناصر المستهدفة. إذا تم تعيينه إلى true، فسيكتشف المراقب أي تغيير في السمات مثل class أو style.

  3. childList: يحدد ما إذا كان يجب على المراقب اكتشاف تغييرات في هيكل العنصر المستهدف نفسه (مثل الإضافة أو الإزالة للعناصر الفرعية). عند تعيينه إلى true، فسيكتشف المراقب أي تغيير في العناصر الفرعية المباشرة للعنصر المستهدف.

  4. subtree: يحدد ما إذا كان يجب على المراقب اكتشاف تغييرات في العناصر الفرعية للعنصر المستهدف بأكمله (بما في ذلك الأعماق). عند تعيينه إلى true، فسيكتشف المراقب أي تغيير في الهيكل تحت العنصر المستهدف.

بالنظر إلى الكود المعطى في المقال، يمكننا أن نلاحظ أن خيار childList تم تعيينه إلى false، مما يعني أن المراقب لن يكتشف تغييرات في هيكل العنصر نفسه. وبالتالي، عندما يتم تغيير textContent، يتم تجاهل هذا التغيير.

لحل هذه المشكلة وضمان اكتشاف MutationObserver للتغييرات التي تتم باستخدام textContent، يجب تعيين خيار childList إلى true.

بعد التعديل، يصبح التكوين كالتالي:

javascript
var config = { characterData: true, attributes: false, childList: true, subtree: true };

هذا التعديل سيضمن أن المراقب يكتشف تغييرات textContent بنجاح ويستجيب لها بشكل مناسب، مما يسهل عليك تتبع التغييرات في المحتوى النصي لعناصر HTML الخاصة بك بشكل دقيق وفعال.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!