جافاسكريبت التي تستهدف التذييل لا تعمل بعد انتقالات الصفحة

لقد كتبت كود CSS لجعل قائمة التذييل متجاوبة. عند التنقل إلى الأجهزة المحمولة، يتم تصميم قوائم التذييل بشكل مشابه لقائمة الهامبرغر. لذا، لقد كتبت دالة نقر في قسم تحرير CSS/HTML >> /head لتبديل القوائم في عرض الجوال.

كانت دالة النقر تعمل بشكل جيد على الصفحة الرئيسية لـ Discourse. ولكن في بعض الصفحات الأخرى مثل الملخص وحساب المنتدى وما إلى ذلك، تم حظر السكربت. لذلك لا يمكنني رؤية القوائم الفرعية. كما يمكنني رؤية السكربت في مصدر المتصفح أيضًا.

لماذا يتم حظر تنفيذ السكربتات المخصصة في بعض الصفحات على Discourse؟ وما هو الحل الدائم لهذه المشكلة؟

Discourse هو تطبيق صفحة واحدة. لذا، فإن السكريبتات التي تضيفها في وسم <head> تعمل مرة واحدة فقط عند تحميل الصفحة الأولية ما لم تستخدم الخطافات المناسبة. ربما تحتاج إلى تعديل كودك لإضافة مستمع للأحداث بدلاً من ذلك.

هل يمكنك مشاركة كودك؟

3 إعجابات

إليك سكريبتي،

ربما توجد عدة طرق لمعالجة هذه المشكلة، لكن دعنا نجرب الطريقة “الصحيحة” باستخدام أدوات التخصيص المناسبة.

عند إضافة HTML إلى قسم التذييل في سمة ما، يقوم Discourse ببعض المعالجة لذلك لمنع القفز بين انتقالات الصفحات أو عند إضافة عناصر إضافية مع التمرير اللانهائي.

يتم إضافته كمكون custom-html هنا.

discourse/app/assets/javascripts/discourse/app/templates/application.hbs at a0bbc346cb5d5b89d1a3efdfa89869349a8b067f · discourse/discourse · GitHub

إذا نظرت إلى كود المكون، ستلاحظ أنه يُطلق حدث تطبيق عند عرضه.

discourse/app/assets/javascripts/discourse/app/components/custom-html.js at a0bbc346cb5d5b89d1a3efdfa89869349a8b067f · discourse/discourse · GitHub

هذه هي الأداة التي تحتاج إلى استخدامها.

كيف تستخدمها؟
توجد طريقة في plugin-api تتيح لك تشغيل كود عند إطلاق حدث تطبيق محدد.

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/lib/plugin-api.js#L507-L519

وبما أننا نعرف بالفعل اسم الحدث، يمكننا استخدامه كما يلي:

api.onAppEvent("inserted-custom-html:footer", () => {
  // قم بعملك هنا
});

وبما أن هذه طريقة خاصة بـ plugin-API، يجب عليك تغيير نوع وسم السكربت إلى text/discourse-plugin كما يلي:

<script type="text/discourse-plugin" version="0.8">
api.onAppEvent("inserted-custom-html:footer", () => {
  // قم بعملك هنا
});
</script>

ستعمل المقطع أعلاه دائمًا عند عرض التذييل. لذا، يمكنك الآن القيام بشيء مثل هذا:

<script type="text/discourse-plugin" version="0.8">
api.onAppEvent("inserted-custom-html:footer", () => {
  $(".footer-div #footerNavDiv").click(function () {
    console.log("تم التقاط حدث النقر");
    // قم بعملك هنا لحدث النقر
  });
});
</script>

يمكنك قراءة المزيد حول plugin-API هنا

5 إعجابات

رائع، شكرًا لك :slight_smile:

إعجاب واحد (1)