Как получить элементы DOM и изменить функциональность onClick

Привет,

Подскажите, пожалуйста, как можно получить элементы DOM в Discourse, не прибегая к использованию setTimeout и querySelector?

Сейчас я делаю примерно так:

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])

Если не использовать указанные выше таймауты, то иногда элементы DOM возвращаются как null, поскольку DOM ещё не полностью загрузился, даже если код обернут в функцию window.onload.

Моя цель — получать элементы DOM и изменять их обработчики событий onChange.

Буду очень признателен за любую помощь.

Спасибо :slight_smile:

Discourse — это полноценное приложение на EmberJS, поэтому вы не можете запрашивать или манипулировать элементами так, как если бы это был обычный HTML-сайт, сгенерированный на сервере.

Чтобы настроить веб-приложение, следуйте рекомендациям в руководстве:

Руководство разработчика по темам Discourse

Помимо ознакомления с руководством разработчика, вы можете отойти от деталей и описать, что вы пытаетесь сделать, а не ваше предполагаемое решение.

Привет, Джей,

Я пытался вызывать аналитические функции moEngage при клике на определённые кнопки на странице (например, «лайк», «комментарий», «поделиться»).

Это возможно только если у меня есть доступ к функции onClick этих кнопок. Есть ли какой-то плагин в Discourse, который поможет мне это реализовать?

Спасибо

Вы должны иметь возможность сделать это в компоненте темы. Рекомендую начать с руководств для разработчиков, чтобы понять, как всё работает.