Кастомный JavaScript применяется только после обновления страницы, создание категорий для плагина location

Привет,

Ниже приведенный скрипт в плагине «Локация» постоянно отображает всплывающую подсказку и раскрашивает их в зависимости от типа (мероприятия, места и т. д.). Я работаю над легендой и, возможно, над фильтром.

Проблема в том, что всё работает, но только после обновления страницы. При переходе на страницу по ссылке ничего не происходит.

В консоли нет различий в ошибках в обоих случаях, и увеличение задержки функции ничего не меняет.

У кого-нибудь было подобное при добавлении JS в заголовок через меню редактирования темы? Нашли ли вы решение?

Вот изображение результата:

Ошибки здесь появляются как с кодом, так и без него, поэтому они не связаны с ним.

<script>
document.addEventListener('DOMContentLoaded', function() {
  // Применяем CSS для изменения стиля текста alt
  var style = document.createElement('style');
  style.type = 'text/css';
  style.innerHTML = `
    /* Убедитесь, что текст alt жирный, подчеркнутый и имеет условный цвет */
    .leaflet-marker-pane img[alt] {
      font-weight: bold !important; /* Сделать текст жирным */
      text-decoration: underline !important; /* Подчеркнуть текст */
      white-space: nowrap; /* Запретить перенос текста на новую строку */
    }
  `;
  document.head.appendChild(style);

  // Даем странице время загрузиться и изображениям отобразиться
  setTimeout(function() {
    var images = document.querySelectorAll('.leaflet-marker-pane img');

    images.forEach(function(img) {
      var title = img.getAttribute('title');
      if (title) {
        title = title.length > 10 ? title.substring(0, 10) + '..' : title;
        img.setAttribute('alt', title);
        img.setAttribute('title', title);

        if (title.includes('/')) {
          img.style.color = 'white';
        } else {
          img.style.color = 'black';
        }
      }
      img.setAttribute('src', '');
    });
  }, 1000);  // Задержка выполнения на 1 секунду (1000 мс)
});



</script>

Если я не ошибаюсь, поскольку Discourse — это одностраничное приложение, вам, вероятно, придется использовать api.onPageChange() из API плагинов для этого.

Верно, и использование скриптов скоро будет устаревшим.

Хорошо знать, мне не придётся использовать адаптированный window.location.reload(true) в заголовке для фреймворка ember.js, который, возможно, мог бы стать решением этой проблемы.

Удаляется ли поле заголовка по соображениям безопасности? Дело в том, что оно всё ещё удобно для тестирования чистого JavaScript в нём.

Нет, устаревшим считается использование плагина API в тегах скриптов (в заголовке).

Хорошо, если использование JavaScript в заголовках скоро будет устаревшим, мне придется адаптировать несколько вещей. Возможно, в этом поле заголовка стоит добавить уведомление о надвигающихся изменениях.

Думаю, у этого есть свои причины, но это может быть жаль, так как скрипты в заголовках полезны: они позволяют быстро вносить изменения для администраторов, например, закрывать регистрацию на событие, когда определенное число достигается с помощью JavaScript-функции для конкретной категории.

Извините, я ответил вам вместо Джея, который сказал, что скрипты будут устаревать. Я полагаю, он имеет в виду скрипты в заголовке, которые очень удобны для быстрых изменений, как и в любой CMS для веб-сайтов.

На самом деле я нашёл решение, которое перезагружает только страницу «Карта» каждый раз, когда вы на неё переходите.

Теперь я задаюсь вопросом, стоит ли делиться этим с другими здесь, если скрипты в заголовке будут устаревать? Скрипт в этом посте позволяет назначать цветовые категории в зависимости от содержимого заголовка события на карте; это должно быть легко изменяемо, и не через функцию API.

<script> (function(){function e(){if(location.pathname.includes("/map")){if(!sessionStorage.getItem("map-refreshed")){sessionStorage.setItem("map-refreshed","true");requestAnimationFrame(()=>{setTimeout(()=>{location.reload(!0)},100)})}}}function t(){sessionStorage.removeItem("map-refreshed")}function n(e){const t=history[e];history[e]=function(){const n=t.apply(this,arguments);return window.dispatchEvent(new Event("locationchange")),n}}n("pushState"),n("replaceState"),addEventListener("popstate",()=>dispatchEvent(new Event("locationchange"))),addEventListener("locationchange",function(){location.pathname.includes("/map")?e():t()}),e();})(); </script>

Я думаю, вы меня неправильно поняли. Я имел в виду, что устарели скриптовые теги в заголовке, такие как <script type="text/discourse-plugin"> и <script type="text/x-handlebars">, а не обычные теги <script>.

Да, спасибо за уточнение. Я рад, что мы можем использовать JavaScript. Если у вас есть время, посмотрите код, который я оставил, — он может быть полезен в окружениях Ember. Он перезагружает страницу, чтобы JavaScript применился. Это не самый элегантный способ, но для страницы с плагином карты он работает отлично!