Boosty Title Modifier

Добавляет время поста в заголовок *вкладки*

这些是此脚本的所有版本。 只显示代码变更过的版本。

  • v0.45 2025-11-04
  • v0.44 2025-11-03
  • v0.43 2025-11-03
  • v0.42 2025-10-28
  • v0.41 2025-10-28
  • v0.4 2025-10-28

    1. Главное изменение: Архитектура (SPA vs. Статическая страница)

    • Старый (v0.31):

      • Скрипт был "одноразовым". Он активировался только при прямой загрузке страницы, URL которой содержал /posts/ (if (!window.location.pathname.includes('/posts/')) return;).
      • Он пытался запуститься один раз (window.addEventListener('load')).
      • Если элементы не были найдены сразу, он использовал MutationObserver + setTimeout(3000) как "костыль" (запасной вариант), чтобы поймать загрузку, после чего отключался.
      • Проблема: Он не работал, если вы переходили на пост из ленты (или с поста на пост) без перезагрузки страницы, так как событие load не срабатывало, а URL-проверка проходила слишком рано.
    • Новый (v0.4):

      • Скрипт стал "постоянным" (персистентным) и работает на всех страницах сайта (@match https://boosty.to/*).
      • Он больше не проверяет URL при запуске. Вместо этого он использует два постоянных MutationObserver для отслеживания переходов пользователя по сайту:
        1. bodyObserver ("Искатель"): Постоянно следит за <body>. Его задача — обнаружить, что пользователь перешел на страницу поста (нашел нужный h1 в основной колонке) или ушел с нее.
        2. titleObserver ("Защитник"): Активируется только после того, как "Искатель" нашел пост и установил наш заголовок. Его задача — немедленно отменять любые попытки скриптов Boosty сбросить заголовок (например, при прокрутке страницы).

    2. Управление Состоянием (State Management)

    • Старый (v0.31): Не имел состояния. Просто пытался найти > отформатировать > установить заголовок > отключиться.
    • Новый (v0.4): Введены глобальные переменные состояния:
      • currentFormattedTitle: Хранит заголовок, который установил скрипт. "Защитник" использует эту переменную для восстановления заголовка.
      • currentPostId: Хранит ID (data-post-id) текущего поста. Это нужно, чтобы:
        • Не обрабатывать один и тот же пост повторно при мелких обновлениях DOM (например, загрузке комментариев).
        • Понять, что пользователь ушел со страницы поста (пост не найден, но currentPostId еще задан).

    3. Обработка ухода со страницы

    • Старый (v0.31): Никак не обрабатывал. Если бы заголовок установился, он остался бы навсегда (до перезагрузки), даже если вы вернулись в ленту.
    • Новый (v0.4): "Искатель" (bodyObserver) обнаруживает, когда элемент поста (#column-1 [data-test-id="COMMON_POST:ROOT"]) или его заголовок h1 исчезают из DOM. В этот момент он:
      • Отключает "Защитника" (titleObserver.disconnect()).
      • Сбрасывает состояние (currentPostId = null, currentFormattedTitle = null).
      • Это позволяет Boosty вернуть свой обычный заголовок (например, "Лента" или "Блог автора").

    4. Надежность селекторов

    • Старый (v0.31):
      • getPostTime(): Искал [class*="CreatedAt"][class*="headerLink"] как запасной вариант.
      • getPostTitle(): Искал любой h1 на странице или [class*="Post_title"]. Это было ненадежно и могло захватить не тот заголовок.
    • Новый (v0.4):
      • Поиск стал гораздо точнее и привязан к структуре поста.
      • Скрипт сначала ищет основной пост только в главной колонке: document.querySelector('#column-1 [data-test-id="COMMON_POST:ROOT"]'). Это отсекает посты в боковой панели.
      • Затем он ищет h1 внутри этого элемента поста: postElement.querySelector('h1[data-test-id="COMMON_POST_POSTCONTENT:TITLE"]', ...)
      • Это гарантирует, что мы на странице одиночного поста (в ленте у постов заголовки h2), а не в ленте.

    5. Обработка ошибок и комментарии

    • Старый (v0.31): В parseBoostyDate не было обработки ошибок.
    • Новый (v0.4): Функция parseBoostyDate обернута в try...catch для предотвращения сбоя всего скрипта, если Boosty вдруг изменит формат даты.
    • Комментарии: Новый скрипт v0.4 чрезвычайно подробно прокомментирован с объяснением логики работы "Искателя", "Защитника" и управления состоянием.
  • v0.31 2025-04-01
  • v0.3 2025-04-01
  • v0.2 2024-07-25
  • v0.2 2024-07-25
  • v0.2 2024-07-25
  • v0.1 2024-01-06
  • v0.1 2024-01-04
  • v0.1 2023-12-24