海棠书屋

自己写的回帖显示排序小工具

海棠书屋 2025-08-01 19:51 出处:网络 编辑:@海棠书屋
Update: 刚刚发了一贴,结果发现有个地方的逻辑写错了,更正后重发。之前也提到 https://www.cool18.com/bbs4/index.php?app=forum&act=threadview&tid=14492582 二级回帖排序的问题。于是自己想了个解决方法。采用
Update: 刚刚发了一贴,结果发现有个地方的逻辑写错了,更正后重发。

之前也提到 https://www.cool18.com/bbs4/index.php?app=forum&act=threadview&tid=14492582 二级回帖排序的问题。于是自己想了个解决方法。

采用的技术是Javascript写的Bookmarklet(小书签),支持Chrome和Firefox等桌面浏览器。Bookmarklet(小书签)具体的描述可以详见维基百科。

操作步骤:将以下代码保存为书签,然后最好固定在书签栏中以这样方便点击:

javascript:(function(){function getLevel(item) { return parseInt(item.className.slice(3)); } ; function getTid(item) { return parseInt(new URL(item.childNodes[0].href).searchParams.get('tid')); } ; function node(val, level, tid, parent) { this.val = val; this.level = level; this.tid = tid; this.child = []; this.parent = parent; } ; function work(arr, base) { if (arr.length == 0 || arr.length == 1) { return arr; } ; var root = new node(); var pre = null; for (const element of arr) { var depth = getLevel(element); var tid = getTid(element); if (depth == base) { var n = new node(element, depth, tid, root); root.child.unshift(n); root.child.sort((a, b) => { return a.tid - b.tid; }); pre = n; } else { var parent = null; if (depth == pre.level) { parent = pre.parent; } else if (depth > pre.level) { parent = pre; } if (depth < pre.level) { parent = pre.parent; while(parent.level != depth-1) { parent = parent.parent } } var n = new node(element, depth, tid, parent); parent.child.unshift(n); parent.child.sort((a, b) => { return a.tid - b.tid; }); pre = n; } } function reduce(item) { var res = []; for (const element of item) { res.push(element.val); if (element.child.length != 0) { res.push(...reduce(element.child)); } } return res; } var res = reduce(root.child); return res; } ; var uls = document.getElementsByClassName('thread-list'); if (uls.length > 0) { var ul = uls[0]; var items = [...ul.children]; if (ul.classList.contains('post-items')) { ul.replaceChildren(...work(items, 1)); } else { var res = []; var pos = 0; for (let i = 1; i < items.length; i++) { if (items[i].className == 'l-m1') { res.push(items[pos], ...work(items.slice(pos + 1, i), 2)); pos = i; } } ; res.push(items[pos], ...work(items.slice(pos + 1, items.length), 2)); ul.replaceChildren(...res); } }})();

示例图

当你想要二级评论按照发帖时间越新(帖子ID越大)越在后面显示的时候,可以点击这个书签。支持主页的二级评论(主页的主贴仍然按照最新发布的在最前面的排序方式)和详情页的评论。也支持留园的其他板块(没有测试过)

需要注意的是这个脚本不会自动执行,例如主页滚到最底端后加载出了更多的帖子的时候,新加载的帖子仍然是按照原有的顺序显示,你需要再点击一次这个书签。

当然如果留园对网页进行了修改,这个Bookmarklet可能会失效。

代码原理就是构建一棵树结构然后深度优先遍历输出结果。由于Bookmarklet只支持单行,于是不得不压缩成一行,但代码没有任何混淆、网络请求、恶意操作,纯粹网页前端操作DOM,欢迎各位审计。
0

精彩评论