|
|
本帖最后由 青春向上 于 2026-1-4 14:19 编辑
链接:
github:qcxs/mtbbs: 自用mt论坛脚本
若无法访问请寻找镜像源或qcxs/mtbbs CDN by jsDelivr
包含文件:
communityAutoNextPage.js
介绍:
集众多页面为一体,统一使用page参数控制分页。滚动加载下一页,手动加载上一页,页码跳转,地址栏无刷新更新。已适配:社区、导读、搜索、个人空间帖子/回复/留言、帖子评论、我的好友、积分明细、消息提醒。
怕你们分不清适配了哪些页面,给你们贴几张图片:
社区包含:版本发布、插件交流、建议反馈、逆向交流、玩机交流、编程开发、求助问答、综合交流、休闲灌水、官方公告、申诉举报、站务专区
导读:(注意:首页下滑也算导读)
个人空间内帖子:(右下角我的-我的帖子)
阅读别人也算:
我的好友页面:
总结:会分页的页面都可以自动阅读下一页。
但论坛之大,总有一些疏忽,留着以后更新。
使用教程:
方案1:油猴添加新脚步:全选-粘贴-保存
方案2:直接以js形式执行即可,适合嵌入论坛app内。
代码均带有注释,可ai分析。
主要功能介绍:
1,只适配手机端,自动展开下一页,显示第n页标识,拥有重试机制,主要功能正常使用。
评论自动展开:
2,记录已阅读页码,例如阅读第10页时,修改网址为第9页,可避免因误操作刷新导致阅读进度丢失
思路来源于:WhiteSevs/TamperMonkeyScript: 自用油猴脚本
这里有个细节:
为什么保存上一页而不是当前页?举例:刚刚阅读第10页不久
因为浏览器有自动记忆滚动条功能,如果保存第10页,刷新后由于记忆滚动条,会自动滚动到页面底部,此时相当于把第10页阅读完了,直接又加载第11页,万一又刷新,此时又滚动并加载第12页,死循环。(虽然也可以禁用浏览器记忆滚动条,但此功能还是很实用的,保留)
相比之下,记录第9页,由于滚动,会加载第10页,此时可继续阅读第10页(虽然第10页进度丢失,但可以接受)
那为什么会“滚动到页面底部”呢?不应该刚好滚动至上一个阅读位置吗?
因为论坛有阻止缓存机制,当你点击一个帖子后,返回时,它只会刷新当前页,之前的所有下一页数据全部丢失。
于是假设你已阅读许多下一页内容,此时滚动条会非常长,这时刷新按理说应该滚动到原位置,但原位置的帖子因为“阻止缓存机制”丢失了,那浏览器只会滚动到页面底部。
综上经过一阵思考,最终妥协为此方案。
3,核心科技:点击帖子直接在新标签中打开,避免因返回触发刷新
点击帖子标题或内容,会在新标签中打开,其余操作逻辑不变。(应该没人点那个评论吧?)
- // 定义独立函数,方便后续解除拦截(如需)
- function handleCaptureClick(e) {
- // 1. 判断点击元素是否有「class为forumlist_li的li父元素」(包括自身)
- const forumlistDiv = e.target.closest('div.mmlist_li_box');
- if (!forumlistDiv) {
- return; // 无目标父元素,不拦截,执行原点击行为
- }
- // 2. 找到该div下所有a标签,遍历匹配链接
- const targetLinks = forumlistDiv.querySelectorAll('a');
- let matchedUrl = null;
- // 正则表达式:匹配 thread-数字-任意字符.html 格式(支持 thread-xxxx-1-1.html 等变体)
- const threadReg = /thread-\d+.*\.html$/i;
- for (const link of targetLinks) {
- const href = link.getAttribute('href') || '';
- // 3. 正则匹配目标链接格式
- if (threadReg.test(href)) {
- matchedUrl = href;
- break; // 找到第一个匹配链接即可
- }
- }
- // 4. 有匹配链接:新标签打开,拦截原行为;无匹配:不拦截
- if (matchedUrl) {
- e.preventDefault(); // 阻止原跳转/默认行为
- e.stopPropagation(); // 阻止事件传播(避免其他脚本触发)
- e.stopImmediatePropagation(); // 阻止同阶段其他监听者
- window.open(matchedUrl, '_blank'); // 新标签打开页面
- }
- }
- // 捕获阶段绑定全局click事件(关键:第三个参数true)
- document.addEventListener('click', handleCaptureClick, true);
复制代码 原理:当点击网页元素时,浏览器会进行从上到下捕获 → 命中目标 → 从下到上冒泡,此代码作用与捕获阶段,处于最上层。
代码解析:
论坛有jQuery,直接使用。
//距离页面底部多少像素时,触发加载下一页
const loadThreshold = 1500;
//论坛几乎所有页面,添加inajax=1参数,就能获得xhtml,比直接访问得到的信息更少,适合动态加载时用作请求url
const requestUrl = buildJumpUrl(nextPage) + "&inajax=1";
//具体如何实现下一页,可去抓首页的包(滑动底部时自动加载下一页)
然后进行一些简单的分析,发现comiis_list_page_1函数用来加载下一页,将其代码copy,发送给ai,让ai理解,并将其余页面的结构也发给ai,最后一阵洽谈,就写出来了。
//判断当前正在浏览第n页,通过判断“第n页/共x页”标签是否显示在可视页面中
- // 创建观察者实例
- const observer = new IntersectionObserver((entries) => {
- entries.forEach(entry => {
- const { target, isIntersecting } = entry;
- const markerText = target.textContent?.trim();
- const pageMatch = markerText.match(/第(\d+)页/);
- if (!pageMatch || !isIntersecting) return;
- //已阅读完上一页
- const pageNum = parseInt(pageMatch[1]) - 1;
- const newUrl = buildJumpUrl(pageNum);
- if (window.location.href !== newUrl) {
- console.log('已阅读' + pageNum)
- window.history.replaceState({}, document.title, newUrl);
- }
- // 持续监听,当用户返回上一页时,可以更新为上一页,故始终监听
- // observer.unobserve(target);
- });
- }, {
- threshold: 0.8 // 显示80%触发,兼顾体验与准确性
- });
复制代码 //如果你的屏幕特别特别大,导致可以显示多个“第n页/共x页”,可能会出现未知错误,此时建议你修改“第n页/共x页”的添加逻辑,取余判断是否添加。
页码选择器:
当前页数通过已激活的class判断,总页数通过下拉列表项总数得出。PS:脚本执行时,会隐藏它,如果想切换页码,请点击“第n页”。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +1
金币 +2
|