【自定义】网站标签页标题

在页面加载前修改网页标题,并防止网站覆盖,支持多网站设置不同标题

// ==UserScript==
// @name         【自定义】网站标签页标题
// @namespace     https://github.com/realSilasYang
// @version       2025-7-29
// @description   在页面加载前修改网页标题,并防止网站覆盖,支持多网站设置不同标题
// @author        阳熙来
// @icon             data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzUzNjEwMjc1OTc1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE3NTIiIGRhdGEtZGFya3JlYWRlci1pbmxpbmUtZmlsbD0iIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiPjxwYXRoIGQ9Ik0yMTcuNiA3OTMuNmg1NjMuMmMyMC40OCAwIDM4LjQgMTcuOTIgMzguNCAzOC40cy0xNy45MiAzOC40LTM4LjQgMzguNGgtNTYzLjJjLTIwLjQ4IDAtMzguNC0xNS4zNi0zOC40LTM4LjQgMC0yMC40OCAxNy45Mi0zOC40IDM4LjQtMzguNHoiIGZpbGw9IiNBM0NDRkYiIHAtaWQ9IjE3NTMiIHN0eWxlPSItLWRhcmtyZWFkZXItaW5saW5lLWZpbGw6IHZhcigtLWRhcmtyZWFkZXItYmFja2dyb3VuZC1hM2NjZmYsICM0NTQ4NGEpOyIgZGF0YS1kYXJrcmVhZGVyLWlubGluZS1maWxsPSIiPjwvcGF0aD48cGF0aCBkPSJNNzkzLjYgMzQwLjQ4bC01OC44OCA2Ni41Ni0xOTkuNjgtMjA0LjggNjEuNDQtNjRjMTIuOC0xNS4zNiAzMy4yOC0xNS4zNiA0OC42NCAwbDE0OC40OCAxNTMuNmMxMi44IDEyLjggMTIuOCAzMy4yOCAwIDQ4LjY0ek0xOTkuNjggNTQyLjcyTDQ5MS41MiAyMzguMDhsMTk5LjY4IDIwNC44LTI5MS44NCAzMDQuNjRIMTk5LjY4di0yMDQuOHoiIGZpbGw9IiMyNTg5RkYiIHAtaWQ9IjE3NTQiIHN0eWxlPSItLWRhcmtyZWFkZXItaW5saW5lLWZpbGw6IHZhcigtLWRhcmtyZWFkZXItYmFja2dyb3VuZC0yNTg5ZmYsICMyMDVlYTgpOyIgZGF0YS1kYXJrcmVhZGVyLWlubGluZS1maWxsPSIiPjwvcGF0aD48L3N2Zz4=
// @license          GNU GPLv3
// @grant            none
// @match        *://tophub.today/*
// @match        *://*.tophub.today/*
// @match        *://gushiwen.cn/*
// @match        *://*.gushiwen.cn/*
// @run-at       document-start
// ==/UserScript==

(() => {
  'use strict';

  /* 1. 先写死映射表,可根据需要继续加 */
  const titleMap = {
    'tophub.today':        '新闻聚合',
    'www.tophub.today':    '新闻聚合',
    'gushiwen.cn':         '古诗文网',
    'www.gushiwen.cn':     '古诗文网'
  };

  /* 2. 立即拿到想要的标题 */
  const targetTitle = titleMap[location.hostname];
  if (!targetTitle) return;

  /* 3. 先把标题改掉,越早越好 */
  document.title = targetTitle;

  /* 4. 监听 <title> 的文本变化,一旦网站想改就改回来 */
  const lockTitle = () => {
    const titleEl = document.querySelector('title');
    if (!titleEl) return false;

    new MutationObserver(() => {
      if (document.title !== targetTitle) document.title = targetTitle;
    }).observe(titleEl, { childList: true, subtree: true });

    return true;
  };

  /* 5. 如果 <title> 还没出现,就轮询到出现为止(最多 5 秒) */
  const maxWait = Date.now() + 5000;
  const tryLock = () => {
    if (lockTitle()) return;
    if (Date.now() > maxWait) return;
    requestAnimationFrame(tryLock);
  };
  tryLock();

  /* 6. 极端场景:SPA 路由切换后又被改标题,直接挂全局 hook */
  let originalTitleDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'title');
  Object.defineProperty(document, 'title', {
    set(v) {
      originalTitleDescriptor.set.call(document, targetTitle);
    },
    get() {
      return originalTitleDescriptor.get.call(document);
    },
    configurable: true
  });
})();