简介
Dizcuz论坛(吾爱就是)一般都支持帖子列表和帖子内通过左方向键和右方向键来快速翻页, 但我的-收藏页面明明有下一页上一页按钮, 却不支持方向键翻页.
本脚本使得我的-收藏页面能够使用方向键来快速翻页(无论在哪个页面都不要按太快, 按太快会触发Too Many Rqeusts
😂 ), 并且 上一页 /下一页的内容会追加到当前页面最后, 不会刷新页面, 所以在自己的收藏中找内容时会更加方便(再次提醒按方向键太频繁会触发Too Many Requests
), 顶部地址栏也可以看到翻到第几页了, 如www.52pojie.cn/home.php?mod=space&uid=*&do=favorite&type=all&page=10
中,page后面的数字就是当前页数
使用方法
鉴于有人看完简介后还在问使用方法,那就简单说一下.
- 在油猴插件中新建脚本, 然后把下列代码区域的内容全部粘贴进去,再按下
Ctrl+S
保存,刷新吾爱论坛的页面.
- 在网页端右上角有一个我的,这个我的按钮让鼠标悬浮在上面是有更多选项的,其中一个选项就是收藏,点击收藏就可以进入你自己的收藏页,查看自己收藏过的帖子.
- 在自己的收藏页,如果你的收藏页数超过了1页,那么可以通过左方向键或者右方向键来翻页
- 无论是往前翻页还是往后翻页, 内容都会追加到网页底部, 并且已经追加过的内容不会重复追加
- 翻到第1页或者最后一页后,继续往前翻页/往后翻页 ,会提醒不能翻页了.
脚本内容
在油猴插件中新建脚本, 然后把下列代码区域的内容全部粘贴进去, 再按下Ctrl+S
保存即可.(下面把匹配到的用户名全部at一遍保证脚本内容正常)
@name @namespace @version @AuThor @match @Icon @grant
// ==UserScript==
// @name 吾爱论坛收藏页方向键翻页
// @namespace www.52pojie.cn
// @version 1.0
// @description 个人收藏界面,方向键控制上一页下一页
// @author abusideluoyin
// @match https://www.52pojie.cn/home.php?mod=space&do=favorite&view=me
// @match https://www.52pojie.cn/home.php?mod=space&uid=*&do=favorite&type=all&page=*
// @icon none
// @grant none
// ==/UserScript==
(function() {
'use strict';
var nxtButton = document.getElementsByClassName("nxt")[0];
var prevButton = document.getElementsByClassName("prev")[0];
//url模板,填id和page后发请求要用
var urlPattern = 'home.php?mod=space&uid=*&do=favorite&type=all&page=*';
//当前浏览器地址
var curLocation = document.location;
//当前域名
var curOrigin = curLocation.origin;
//当前请求参数字符串
var curSearch = curLocation.search;
//当前请求参数
var curSeachParams = new URLSearchParams(curSearch);
//获取id,此处获取方式为下一页按钮的href中获取
var buttonHref;
if(nxtButton !== undefined){
buttonHref = nxtButton.href;
}else{
buttonHref = prevButton.href;
}
var uid;
var startIndex = buttonHref.indexOf('?')
var hrefSearchParams = new URLSearchParams(buttonHref.slice(startIndex));
uid = hrefSearchParams.get('uid');
//获取page
var page;
if (curSeachParams.has('page')){
//有参数则获取当前页
page = curSeachParams.get('page');
}else{
//否则默认第1页
page = '1';
//跳转到有页数的url
document.location.href = urlPattern.replace('uid=\*','uid='+uid).replace('page=\*','page=' + page);
}
var pageInt = parseInt(page);
var nxtPage = pageInt + 1;
var prevPage = pageInt - 1;
var newUrl;
//绑定按键
document.addEventListener("keyup",function(e){
if (e.key === "ArrowRight"){
getPageData(true);
}
if (e.key === "ArrowLeft"){
getPageData(false);
}
},false);
//请求下一页数据的函数
function getPageData(direction){
//如果的前翻页
if(!direction){
if(prevPage < 1){
alert("不能再往前翻了,已经到头了");
return;
}
newUrl = urlPattern.replace('uid=\*','uid='+uid).replace('page=\*','page=' + prevPage--);
}
//如果是后翻页
else{
newUrl = urlPattern.replace('uid=\*','uid='+uid).replace('page=\*','page=' + nxtPage++);
}
let xhr = new XMLHttpRequest();
xhr.open('post',curOrigin+'/'+newUrl,true);//异步
xhr.setRequestHeader('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7');
xhr.reponseType = 'document';
xhr.overrideMimeType('text/html');
xhr.addEventListener('load',function(){
if(xhr.readyState === 4){
//判断状态码
if((xhr.status >= 200 && xhr.status < 300)
|| (xhr.status === 304)){
var parser = new DOMParser();
getAndAppendResponse(parser.parseFromString(xhr.responseText, "text/html"));
}
//状态码不对的话尝试获取服务器返回的信息
else{
console.error(xhr.statusText);
alert(xhr.statusText);
}
}
});
//10秒超时
xhr.timeout = 10 * 1000;
xhr.send();
}
//操作返回数据DOM的函数
function getAndAppendResponse(XML){
if(!XML){
return;
}
let responseUl = XML.getElementById('favorite_ul');
if(!responseUl){
alert("不能再往后翻了,已经到底了");
return;
}
var FavoriteUl = document.getElementById('favorite_ul');
let responseLis = responseUl.childNodes;
responseLis.forEach(
function(childNode){
FavoriteUl.append(childNode);
}
);
if (curSeachParams.has('page')){
history.replaceState(null,'',curOrigin+'/'+newUrl);
}
}
})();