主题头部添加 Javascript 报错 $ 未定义

您好,

在 管理员 > 自定义 > 主题 > 标题部分,我添加了以下内容,但它返回
未捕获的 ReferenceError:$ 未定义

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

但是,如果我添加以下内容,它就能正常工作而不会出错。

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

大多数情况下,$ 未定义错误是因为 jQuery 未加载,但是标题脚本不应该默认在 jQuery 加载后执行吗?

使用原生 JavaScript,而不是 jQuery。

2 个赞

谢谢,但如果这是 JavaScript,它在开发者控制台中运行时效果很好
document.querySelector('.topic-list .topic-excerpt[href="/t/urltobechanged/8"]').setAttribute('href', "/t/newurltoset/17");

不知何故,当它从 Discourse 的 header 加载时,它被返回为“Uncaught TypeError: document.querySelector(…) is null”,无论我是否将其包装在其中:

function doSomething() {
or
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 个赞

好的,我现在明白了,你认为从 WordPress/Joomla 开发过来的,在页眉中添加 JS 会以同样的方式工作。

你提供的链接确实提供了一个解决方案,请注意,现在 script type='text/discourse-plugin' 的页眉已被弃用 Modernizing inline script tags for templates & JS API

为了快速解决 URL 的问题,我最终直接从 Discourse 管理后台进行了永久链接设置。

感谢你的支持和解释!

1 个赞