Javascript adicionado ao cabeçalho do tema retorna $ não está definido

Olá,

Em Admin > Personalizar > Temas > na seção de cabeçalho, adicionei o seguinte, mas retorna
Uncaught ReferenceError: $ is not defined

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

No entanto, se eu adicionar o seguinte, ele funciona bem sem erros.

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

Principalmente este erro $ is not defined ocorre porque o jQuery não está carregado, no entanto, os scripts do cabeçalho não deveriam ser executados por padrão após o carregamento do jQuery?h.

Use JavaScript nativo, não jQuery.

2 curtidas

Obrigado, mas este javascript funciona bem quando usado no console do desenvolvedor
document.querySelector('.topic-list .topic-excerpt[href="/t/urltobechanged/8"]').setAttribute('href', "/t/newurltoset/17");

De alguma forma, quando é carregado do cabeçalho do Discourse, ele é retornado como “Uncaught TypeError: document.querySelector(…) is null”, não importa se eu o envolvo com :

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

Alguma ideia de como esta única linha para alterar o atributo href deve ser executada, já que funciona bem no console do desenvolvedor?

Como o Discourse é uma SPA, depender do “DOMContentLoaded” do documento não será muito útil, pois o DOM do documento está sempre “carregado”, mas os elementos podem estar ausentes. Em vez disso, você vai querer usar Componentes como @merefield mencionou, ou algo como isto: How do you force a script to refire on every page load in Discourse? - #5 by simon. Desta forma, cada vez que a página muda, seu código pode verificar o elemento que você está tentando alterar.

1 curtida

Tudo bem, entendi agora, vindo do desenvolvimento WordPress/Joomla, você acha que adicionar JS ao cabeçalho funcionaria da mesma forma.

Seu link realmente fornece uma solução, note que agora os cabeçalhos <script type='text/discourse-plugin'> estão obsoletos Modernizing inline script tags for templates & JS API

Para resolver rapidamente a situação do URL, acabei fazendo um permalink diretamente do admin do Discourse.

Obrigado pelo suporte e pela explicação!

1 curtida