【脚本】打开话题时默认以嵌套方式查看(显示树形评论区)v1.7.5 - 6/9更新

にたま懂个じば 2026-05-13 10:28 1

顶置


按佬友需求,更新到了Greasyfork,代码以及后续更新都请到这个链接里获取。



更新日志








































































































版本 更新日期 标签 更新日志主要内容
1.7.5 6/9 修复 修复类似投票话题仍被预检改写到树形视图而导致内容闪烁消失的问题:补充识别 cooked/raw 投票标记、顶层 custom_fields.has_pollshas_poll(s) 等字段;页面已带投票 class 时不再隐藏平面内容或发起嵌套预检。
1.7.4 6/9 修复 1. 修复话题搜索面板在路由切换或关闭后可能被旧请求回包污染的问题
2. 标题恢复请求失败后允许后续重试。
3. body MutationObserver 改为调度楼层定位检查,避免每次 DOM 变动同步扫描;`L` 菜单的 document 级关闭监听器改为只安装一次。
1.7.3 6/9 修复 1. 修复进入帖子时先显示平面视图再闪到嵌套视图的问题。
2. 为快速前进/后退和异步点击预检增加路由快照保护,避免 stale 回调干扰 Discourse SPA 路由。
1.7.2 6/4 修复 修复进入话题会无法识别topic,导致跳转显示话题不存在的问题
1.7.1 6/4 优化 新增 修复 1. 在话题工具菜单中新增“以嵌套方式查看”,用于从平面视图清理平面视图短期锁并切回对应 /n/… 树形地址;如果当前平面地址带有楼层号,会保留楼层号。
2. 修复 /t/topic/{topicId}/1 被自动改写为 /n/topic/{topicId}/1?sort=old 后进入 1 楼单个消息串的问题,现在会归一化为完整树形话题。
1.7.0 5/31 优化 新增 修复 1. 将话题页顶部入口从放大镜改为 L 话题工具菜单
2. 按钮工具菜单提供“以平面方式查看”功能
3. 修复搜索结果“平面查看”跳到楼层后又被自动切回嵌套视图的问题
1.6.8 5/28 修复 修复 Discourse 通用 topic 占位 slug 话题被改写成 /n/topic/{topicId} 后,站点跳到 /n/{topicId} 并无法显示的问题;这类话题经 JSON 预检后保持原始 /t/topic/{topicId} 平面地址,其他支持树形视图的话题不受影响
1.6.7 5/24 修复 修复“进入帖子没有显示全部内容”的问题
1.6.6 5/24 修复 修复“切换以平面方式查看之后会自动变回嵌套方式查看”的问题
1.6.5 5/21 修复 修复“修复话题列表中进入帖子会直接显示单一话题串”的问题
1.6.4 5/21 修复 修复“在通知列表里无法精准跳转”的问题
1.6.3 5/21 修复 修复“在帖子中打开新帖子会在二级嵌套回复中显示前帖子的回复内容”的问题
1.6.2 5/20 优化 跳过以下不能使用嵌套方式查看的话题:• 私信话题 private_message • banner 话题 banner • post-voting 话题:is_post_votingsubtype: question_answer • 含 Discourse poll 数据的帖子:post_stream.posts[].polls
1.6.1 5/15 修复 修复“以平面方式查看”按钮不生效
1.6 5/7 新增 1. 默认以嵌套方式查看
2. 嵌套方式查看时,在原搜索按钮右边添加话题内搜索按钮,点击可直接跳转对应楼层

备注


基于@hadeweix 原贴https://linux.do/n/topic/1911062?sort=old 更改

有发现什么bug可以跟贴,有空就修

纯ai更改,让ai评估了脚本对论坛影响应该是偏低的,如果有什么问题请让我删帖


效果


话题内搜索


点击嵌套查看


点击平面查看

最新回复 (19)
  • Black名單 05-13 16:14
    1

    挺好的 ^-^



    提个优化体验的小意见:

    目前点击搜索结果跳转后,会刷新页面进行跳转,速度有点慢

    改成直接跳转到对应楼层就更好了

  • にたま懂个じば 楼主 05-13 16:49
    2

    直接跳转不了吧,如果你在很后面的楼层,它好像没办法直接给你加载到很后面


    要精准跳到对应楼层的话,刷新页面是最快的了应该

  • GMYXDS 05-14 15:14
    3

    还有一个问题,以嵌套查看的话,浏览器tab上的标题没有了

  • にたま懂个じば 楼主 05-14 15:18
    4

    我后面更新过一次代码的(就是解决这个问题),你复制脚本代码覆盖了再试一遍?

    现在我用起来都正常出title诶

  • noise 05-14 15:25
    5

    真的很需要这个功能,之前设置里找好久没有这个选项,感谢佬友分享~

  • AX 05-15 14:36
    6

    太神奇了吧,我谷歌了一下,居然就找到了佬友刚开发的脚本。太感谢了!

  • AX 05-15 14:47
    7

    佬友试下这个帖子为什么报错Internal Server Error

    https://linux.do/n/topic/2162787?sort=old

  • にたま懂个じば 楼主 05-15 14:50
    8

    没有啊,我打开正常诶,你换个浏览器试试?

  • AX 05-15 15:31
    9

    直接打开是正常的,按下End到最底下就会报错;换了猫眼浏览器和chromium都是这个报错

  • にたま懂个じば 楼主 05-15 19:21
    10

    这个帖子还真是诶,但是其他一些长帖子测试又没事,要找个时间看看是啥问题。

  • 比一个peace 05-20 10:43
    11

    发现一个神奇的现象,下面这个话题,是那种投票样式的回复:



    就没法切换嵌套查看


  • にたま懂个じば 楼主 05-20 11:25
    12

    这个应该不是脚本问题,我关掉脚本试了一下也是这样的。

    晚点更新一下让脚本默认跳过投票帖子

  • にたま懂个じば 楼主 05-20 13:34
    13

    更新完了,测试没啥问题,你再试试

  • にたま懂个じば 楼主 05-20 13:35
    14

    更新了,你试试最新版本,没见到error了

  • AX 05-20 17:32
    15

    测试成功,目前不会报错了。 感谢更新

  • 红叶 05-20 18:18
    16

    修改了一下脚本,现在浏览器标签支持显示帖子标题了


    // ==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);
    }
    });
    })();
  • にたま懂个じば 楼主 05-20 18:31
    17

    ^-^本来就能正常显示帖子标题啊,为啥要改

  • 红叶 05-20 22:39
    18

    奇怪 装了这个插件后,我的电脑上浏览器标签只能显示LINUX DO,所以改了一下

  • にたま懂个じば 楼主 05-21 09:56
    19

    没事,你改好了自己用,或者用我最新版本都行,反正目的一样

* 帖子来源Linux.do
返回