جافاسكريبت المضاف إلى رأس القالب يعيد '$ is not defined'

مرحباً،

في قسم الإدارة > تخصيص > السمات > في قسم الرأس، أضفت ما يلي ولكنه يعرض الخطأ التالي:
Uncaught ReferenceError: $ is not defined

<script>
$(document).ready(function() {
$('.topic-list .topic-excerpt[href="/t/urltobechanged/8"]').attr('href', "/t/newurltoset/17 ");
});
</script>

ومع ذلك، إذا أضفت ما يلي، فإنه يعمل بشكل جيد بدون أخطاء:

<script>
  console.log("Hello, Discourse!");
</script>

في الغالب، يحدث خطأ $ is not defined هذا لأن jQuery لم يتم تحميله، ولكن ألا ينبغي أن يتم تنفيذ نصوص الرأس بشكل افتراضي بعد تحميل jQuery؟

استخدم جافاسكريبت الأصلي، وليس جي كويري.

إعجابَين (2)

شكرًا، ولكن إذا كان هذا جافاسكريبت، فإنه يعمل بشكل جيد عند استخدامه في وحدة تحكم المطور
document.querySelector('.topic-list .topic-excerpt[href="/t/urltobechanged/8"]').setAttribute('href', "/t/newurltoset/17");

بطريقة ما، عندما يتم تحميله من رأس Discourse، يتم إرجاعه كـ “Uncaught TypeError: document.querySelector(…) is null”، بغض النظر عما إذا كنت أقوم بتغليفه بـ:

function doSomething() {
أو
document.addEventListener("DOMContentLoaded", function(event)

أي فكرة عن كيفية تشغيل هذا السطر الواحد لتغيير السمة href حيث أنه يعمل بشكل جيد في وحدة تحكم المطور؟

نظرًا لأن Discourse هو SPA، فإن الاعتماد على حدث “DOMContentLoaded” في المستند لن يكون مفيدًا جدًا، حيث أن DOM الخاص بالمستند “محمّل” دائمًا ولكن قد تكون العناصر مفقودة. بدلاً من ذلك، ستحتاج إلى استخدام المكونات كما ذكر @merefield، أو شيئًا مثل هذا: How do you force a script to refire on every page load in Discourse? - #5 by simon. بهذه الطريقة، في كل مرة تتغير فيها الصفحة، يمكن لرمزك التحقق من العنصر الذي تحاول تغييره.

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

حسناً، أفهم الآن، قادماً من تطوير ووردبريس/جوملا، تعتقد أن إضافة جافاسكريبت إلى الهيدر ستعمل بنفس الطريقة.

الرابط الذي قدمته يقدم حلاً بالفعل، لاحظ أن رؤوس script type='text/discourse-plugin' أصبحت الآن مهملة Modernizing inline script tags for templates & JS API

لحل مشكلة الروابط بسرعة، انتهى بي الأمر بإنشاء رابط دائم مباشرة من مسؤول ديسكورس.

شكراً للدعم والشرح!

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