Come ottenere elementi DOM e modificare la funzionalità onClick

Ciao,

Hai qualche idea su come posso ottenere elementi DOM su discourse senza dover usare un setTimeout e un querySelector?
Perché attualmente faccio qualcosa di simile: -

setTimeout(() => {
    var createTopicButton = document.querySelector("#create-topic");
    if (createTopicButton)
        createTopicButton.onclick = function(e) {
            if (window.Moengage && window.Moengage.track_event) {
                window.Moengage.track_event("Topic_Create_Clicked", {});
            }
            setTimeout(() => {
                var topicCreate = document.querySelector("#reply-control .save-or-cancel .btn-primary")
                topicCreate.onclick = function(e) {
                    let heading = document.querySelector('#reply-control #reply-title').value;
                    let category = document.querySelector('.select-kit-header-wrapper> .select-kit-selected-name> .name> .badge-wrapper> .badge-category> .category-name')?.innerText;
                    let desc = document.querySelector('.d-editor-textarea-column> .d-editor-textarea-wrapper textarea').value;
                    let imagePresent = desc.includes("upload://");
                    if (window.Moengage && window.Moengage.track_event && heading && category && desc) {
                        window.Moengage.track_event("Topic_Created", {
                            "Category": category,
                            "Topic Name": heading,
                            "Topic Description": desc,
                            "Is_image_present": imagePresent
                        });
                    }

                }
            }, [300])

        };
}, [500])

Se non uso i timeout di cui sopra, a volte ottengo elementi nulli poiché il DOM non è stato caricato completamente, anche dopo averlo inserito in una funzione window.onload.
Quindi il mio obiettivo è ottenere elementi DOM e modificare la funzionalità onChange.

Qualsiasi aiuto in questo sarebbe fantastico.

Grazie :slight_smile:

Discourse è un’applicazione EmberJS completa, quindi non è possibile interrogare/manipolare elementi come se fosse un sito web HTML semplice renderizzato dal server.

Per personalizzare l’applicazione web è possibile seguire le linee guida su
Guida per sviluppatori ai temi di Discourse

1 Mi Piace

Oltre a consultare la guida per sviluppatori, potresti fare un passo indietro e descrivere cosa stai cercando di fare, piuttosto che la tua soluzione suggerita.

1 Mi Piace

Ciao Jay,

Stavo cercando di chiamare le funzioni analitiche di moEngage al clic di determinati pulsanti sulla pagina (ad esempio: mi piace, commenta, condividi).

Posso farlo solo se ho accesso alla funzionalità onClick di questi pulsanti. Esiste un plugin all’interno di Discourse che mi aiuterebbe a raggiungere questo obiettivo?

Grazie

Dovresti essere in grado di farlo in un componente del tema. Ti consiglio di iniziare con le guide per sviluppatori per vedere come funzionano le cose.