在页面加载前修改网页标题,并防止网站覆盖,支持多网站设置不同标题
// ==UserScript==
// @name 【自定义】网站标签页标题
// @namespace https://github.com/realSilasYang
// @version 2025-9-3
// @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/*
// @match *://www.douyin.com/*
// @run-at document-start
// ==/UserScript==
(() => {
'use strict';
/* 1. 映射表,可根据需要继续加。
此外还需在元数据中加入一条规则:
@match *://www.site.com/* */
const titleMap = {
'tophub.today': '新闻聚合',
'www.tophub.today': '新闻聚合',
'gushiwen.cn': '古诗文网',
'www.gushiwen.cn': '古诗文网',
'www.douyin.com': '抖音 - 记录美好生活'
};
/* 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
});
})();