أحتاج إلى تغيير حالات فردية للأيقونات في جميع أنحاء الموقع. لا أريد استخدام replaceIcon() وتجاوز جميع حالات تلك الأيقونة. أرى أنه في الماضي تم جعل هذا ممكنًا لمناطق معينة من الموقع، أو هكذا يبدو، ولكن ليس في جميع أنحاء الموقع.
على سبيل المثال، أريد تغيير إحدى أيقونات التروس في البحث لتعكس بشكل أفضل ما يحدث عندما ينقر عليها المستخدم. لا أريد تغيير جميع أيقونات التروس.
أيقونة، ما هي هذه الأيقونة تحديدًا (أين تظهر)؟ إذا بدا أن هناك حالة معقولة يمكن للآخرين الاستفادة منها، فيمكننا إنشاء اسم مستعار لها للسماح باستبدالها بشكل منفصل.
نحن نستخدم أيقونة “sliders” هنا افتراضيًا (وهي الحالة الوحيدة لهذه الأيقونة في Discourse افتراضيًا) - لذا سيكون من الآمن استخدام replaceIcon() في هذه الحالة
نظرًا لعدم وجود واجهة برمجة تطبيقات لاستبدال الأيقونات الفردية، فإن أفضل طريقة لدعم ذلك اليوم هي تقييم الطلبات لإضافة أسماء مستعارة جديدة تجمع حالات الاستخدام المتشابهة.
على سبيل المثال، نستخدم d-liked كاسم مستعار لـ heart حتى يمكن استخدام replaceIcon() ضد d-liked لتغييرها في سياق الإعجاب، بدلاً من استبدال كل ظهور لأيقونة القلب في التطبيق.
سيكون من الجيد استبدال أي ظهور فردي، وهذا ليس موقفًا غير عادي في السمات - نأمل أن يكون لدينا واجهة برمجة تطبيقات لذلك يومًا ما.
حسنًا، يبدو أنني أفهم الآن ما هو الحكم في هذا الأمر. يؤسفني أن أعرف أنه غير متاح حتى يتم تحديث واجهة برمجة التطبيقات، لذا سأضطر إلى استخدام الطريقة التي اتبعتها في الوقت الحالي.
نعم، أنت على حق! هذا ليس مستقرًا جدًا. ربما يمكن أن يكون أكثر استقرارًا مع requestAnimationFrame أو MutationObserver؟ ولكن نعم، الأفضل سيكون واجهة برمجة تطبيقات مخصصة كما ذكرت.
شكراً لتنبيهك - أنت على حق تمامًا. استخدام api.onPageChange وحده يمكن أن يكون غير موثوق به لأنه يتم تشغيله عند تغيير المسار، وليس بعد عرض DOM. هذا يعني أن هناك خطر حدوث حالة سباق حيث قد لا يكون الزر #create-topic موجودًا بعد عندما يحاول البرنامج النصي الوصول إليه.
api.onPageChange(() => {
const targetSelector = "#create-topic";
const tryEnhanceButton = () => {
const button = document.querySelector(targetSelector);
if (button) {
// قطع المراقب بعد العثور على العنصر
observer.disconnect();
// إخفاء الزر مؤقتًا أثناء استبدال الأيقونة
button.style.display = "none";
// إزالة الأيقونة القديمة إذا كانت موجودة
const oldIcon = button.querySelector("svg");
if (oldIcon) oldIcon.remove();
// إنشاء وإدراج أيقونة SVG جديدة من Font Awesome
const newIcon = document.createElementNS("http://www.w3.org/2000/svg", "svg");
newIcon.setAttribute("class", "fa d-icon d-icon-feather-pointed svg-icon svg-string");
newIcon.setAttribute("xmlns", "http://www.w3.org/2000/svg");
newIcon.innerHTML = '<use href="#feather-pointed"></use>';
button.insertBefore(newIcon, button.firstChild);
// إظهار الزر مرة أخرى
button.style.display = "block";
}
};
// مراقبة التغييرات في DOM ومحاولة تحسين الزر عند إضافته
const observer = new MutationObserver(() => tryEnhanceButton());
observer.observe(document.body, { childList: true, subtree: true });
// المحاولة فورًا أيضًا في حال كان موجودًا بالفعل
tryEnhanceButton();
});
@Don لقد قمت بتضمين MutationObserver للتأكد من أن البرنامج النصي يعمل فقط بمجرد وجود العنصر المستهدف فعليًا، ويقوم بقطع نفسه بعد القيام بعمله لتجنب الحمل الزائد غير الضروري. لا يزال يحاول إجراء فحص فوري في حال كان العنصر موجودًا بالفعل.
أنا غير قادر على جلب أيقونة SVG التي أريدها من نظام أيقونات Discourse، على الرغم من أنني سجلت مجموعة أيقونات SVG إدارية حيث يبدو أنها موجودة في Font Awesome ولكن ليس في Discourse.