一直在用 V2EX.REP 这个扩展看帖子,主要用它右边的“当前页热门回复”。前两天突然发现那一栏错位了:用户名和时间被挤成一个字一行,点楼号也跳不到原楼层了。
等了几天没见更新,手痒,就让 Claude Code 帮着查了一下,顺手修了。说明一下,我不是作者,跟作者也不认识,只是遇到问题修了一下,发出来给遇到同样问题的人参考。
原因
V2EX 最近改了回复区的结构,用户名、时间和红心现在排在一个弹性布局的行里,原来那个装感谢、回复按钮的工具栏(.fr)也没了。插件还是按旧结构写的,于是出了两个问题:
- 侧栏只有 270px 宽,这一行被压缩,用户名和时间就挤成了竖排。
- 插件复制回复到侧栏时,会找旧工具栏,把楼号换成能点的链接。新结构里找不到这个工具栏,楼号就一直是普通文字,点了没反应。
修复方法
不用改插件本身,在 Tampermonkey (或其他用户脚本管理器)里新建一个脚本,粘贴下面的内容并保存,再刷新帖子页就行:
// ==UserScript==
// @name V2EX.REP 热门回复侧栏修复补丁
// @namespace v2ex-rep-top-replies-patch
// @version 1.0
// @description V2EX 改版后,V2EX.REP 右侧“当前页热门回复”用户名被挤成竖排、楼号点了不跳转
// @match https://*.v2ex.com/t/*
// @match https://v2ex.com/t/*
// @match https://*.v2ex.co/t/*
// @run-at document-start
// @grant GM_addStyle
// ==/UserScript==
// 1. 排版:用户名、时间、红心在侧栏里换行显示,不再挤成一字一行
GM_addStyle(`
#top_replies td > .flex-one-row { flex-wrap: wrap; row-gap: 4px; }
#top_replies td > .flex-one-row > .flex-one-row:first-child { flex: 1 1 100%; flex-wrap: wrap; min-width: 0; row-gap: 2px; }
#top_replies td > .flex-one-row > .flex-one-row:last-child { margin-left: auto; }
#top_replies td > .flex-one-row strong { flex: 1 1 100%; min-width: 0; overflow-wrap: anywhere; }
#top_replies td > .flex-one-row .ago { white-space: nowrap; }
#top_replies td > .flex-one-row br { display: none; }
#top_replies .no { cursor: pointer; }
`);
// 2. 点击:侧栏里的楼号点一下,跳到正文里对应的那条回复
document.addEventListener('click', (event) => {
const no = event.target.closest('#top_replies .no');
if (!no) return;
const cloned = no.closest('[id^="top_r_"]');
const target = cloned && document.getElementById(cloned.id.slice(4));
if (!target) return;
event.preventDefault();
event.stopPropagation();
target.scrollIntoView({ block: 'start' });
}, true);
修好后,侧栏每条回复第一行是用户名,第二行是时间和红心,楼号能点了。
几点说明:
- 我只在 Chrome + Tampermonkey 、V2EX 默认主题下试过。用了 V2EX Polish 之类改样式的扩展,可能不适用。
- 这只是个临时补丁。等作者更新修好了,把它删掉就行,留着一般也不冲突。
- 如果你是用 Chrome 商店的扩展版而不是用户脚本版,这个补丁照样能装,前提是装了 Tampermonkey 。
- 已经给作者提了 issue: https://github.com/v2hot/v2ex.rep/issues/6
