修改了一下脚本,现在浏览器标签支持显示帖子标题了
// ==UserScript==
// @name LINUX DO 默认树形评论区
// @namespace http://tampermonkey.net/
// @version 1.7
// @description 在访问 LINUX DO 帖子时,默认使用树形评论区显示(基于截图精准适配 .nested-view__title 结构,完美修复标签页标题问题)
// @author You
// @match *://linux.do/*
// @grant none
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
let forceScrollTop = false;
// 核心转换逻辑:处理链接替换并剥离楼层号
function getNestedUrl(originalUrl) {
try {
let isRelative = originalUrl.startsWith('/');
let baseUrl = isRelative ? window.location.origin : '';
let url = new URL(originalUrl, baseUrl || undefined);
if (url.pathname.startsWith('/t/')) {
let newPath = url.pathname;
if (/^\/t\/[^/]+\/\d+(?:\/\d+)?\/?$/.test(newPath)) {
newPath = newPath.replace(/^\/t\/([^/]+)\/(\d+)(?:\/\d+)?\/?$/, '/n/$1/$2');
} else if (/^\/t\/\d+(?:\/\d+)?\/?$/.test(newPath)) {
newPath = newPath.replace(/^\/t\/(\d+)(?:\/\d+)?\/?$/, '/n/$1');
} else {
newPath = newPath.replace(/^\/t\//, '/n/');
}
url.pathname = newPath;
if (!url.searchParams.has('sort')) url.searchParams.set('sort', 'old');
return isRelative ? url.pathname + url.search + url.hash : url.href;
}
} catch(e) {
console.error("树形评论区脚本 URL 解析出错:", e);
}
return originalUrl;
}
// 🎯 根据你的截图,精准提取并修正标题
function fixPageTitleFromDOM() {
if (!window.location.pathname.startsWith('/n/')) return false;
// 根据你提供的 HTML 结构,精确定位到树形图标题文字
let targetEl = document.querySelector('.nested-view__title a.fancy-title span[dir="auto"], .nested-view__title a.fancy-title');
if (targetEl && targetEl.textContent) {
let cleanTitle = targetEl.textContent.trim();
// 排除掉可能干扰的空数据或未加载完全的代号
if (cleanTitle && cleanTitle !== "LINUX DO" && !cleanTitle.startsWith('/n/topic')) {
let targetTitle = `${cleanTitle} - LINUX DO`;
if (document.title !== targetTitle) {
document.title = targetTitle;
}
return true;
}
}
return false;
}
// 1. 处理页面初次加载
if (window.location.pathname.startsWith('/t/')) {
let targetUrl = getNestedUrl(window.location.href);
if (targetUrl !== window.location.href) {
window.location.replace(targetUrl);
}
}
// 2. 拦截单页应用点击
window.addEventListener('click', function(e) {
let a = e.target.closest('a');
if (!a) return;
if (a.textContent && a.textContent.toLowerCase().includes('view as flat')) return;
let href = a.getAttribute('href');
if (!href) return;
if (href.startsWith('/t/') || href.startsWith('https://linux.do/t/')) {
let newHref = getNestedUrl(href);
if (newHref !== href) {
a.setAttribute('href', newHref);
}
forceScrollTop = true;
setTimeout(() => { forceScrollTop = false; }, 5000);
}
}, true);
// 3. 终极守护:高强度双向监听
window.addEventListener('DOMContentLoaded', () => {
let titleEl = document.querySelector('title');
// 监听浏览器标题本身的变化(防止被论坛系统强行改回默认值)
if (titleEl) {
let titleObserver = new MutationObserver(() => {
if (window.location.pathname.startsWith('/n/')) {
// 如果标题变成了默认的、或者是错乱的,立刻修正
if (document.title === "LINUX DO" || document.title.includes("topic")) {
fixPageTitleFromDOM();
}
}
});
titleObserver.observe(titleEl, { childList: true, characterData: true });
}
// 核心:监听网页正文 DOM 的变动(一旦树形区标题组件被渲染出来,立刻抓取)
let bodyObserver = new MutationObserver(() => {
fixPageTitleFromDOM();
// 处理滚动残留
if (forceScrollTop && window.location.pathname.startsWith('/n/')) {
window.scrollTo({ top: 0, behavior: 'instant' });
forceScrollTop = false;
}
});
bodyObserver.observe(document.body, { childList: true, subtree: true });
// 页面刚加载时的多重连环定时器(应对网络延迟加载)
for (let delay of [50, 150, 300, 600, 1000, 1800, 3000]) {
setTimeout(fixPageTitleFromDOM, delay);
}
});
})();