阿不思的落胤 发表于 2024-7-22 20:26:31

[油猴脚本]我的收藏|收藏页 翻页优化

本帖最后由 阿不思的落胤 于 2024-7-22 20:33 编辑

众所周知,平时看帖的时候是可以方向键左右按来翻页的,但是, 我的收藏|收藏页 是不支持的,如果想在自己的收藏中找到自己印象中的那个主题,那就只能一次又一次点击下一页,然后往下滑,再点击下一页........

本次功能优化就是简化收藏页的翻页操作,此页面也可以用左右方向键来翻页了,并且翻页内容会直接追加到底部,页面无需刷新!!!


@Name @Name @match


油猴脚本如下(也许后续会继续优化,但是应该会新开一帖,新开的话本帖会放链接)(我真的幻想你坛要是支持markdown该多方便啊...id叫Name的和id叫Match的真的很烦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
(如果下面有@开头的内容被<xxx></xxx>包围了的话自己去掉吧,我懒得弄了)
// ==UserScript==
// @name      GM论坛收藏页方向键控制上一页下一页
// @namespace    www.gamemale.com
// @version      2024-07-20
// @description个人收藏界面,左方向键上一页,右方向键下一页
// @author       阿不思的落胤
//@match   https://www.gamemale.com/home.php?mod=space&do=favorite&view=me
// @match      https://www.gamemale.com/home.php?mod=space&uid=*&do=favorite*
// @grant      none
// ==/UserScript==

(function() {
    'use strict';
    var nxtButton = document.getElementsByClassName("nxt");
    var prevButton = document.getElementsByClassName("prev");
    //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;
    //待添加对nxtButton的判空
    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"),this.direction);

                }
                //状态码不对的话尝试获取服务器返回的信息
                else{
                  console.error(xhr.statusText);
                  alert(xhr.statusText);
                }
            }
      });
      //10秒超时
      xhr.timeout = 10 * 1000;
      xhr.send();
    }

    //定义一个操作返回数据DOM的函数
    function getAndAppendResponse(XML,dirction){
      if(!XML){
            return;
      }
      //debugger;
      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);
      }else{
            //todo
      }
    }

})();



娱乐法师火布偶 发表于 2024-7-22 20:40:45

很适合收藏夹爆满的坛友使用呢

凯诺斯 发表于 2024-7-22 20:46:48

我的收藏夹里还是有很多帖子的,有这个脚本会方便很多惹{:6_169:}

Morphyus 发表于 2024-7-22 20:54:01

{:6_188:}不知道有没有收藏夹分类功能

jiarong28 发表于 2024-7-22 20:58:05

有点实用,特别是已经收藏很多游戏或者攻略的人。这样查起来就方便

糖醋鲤鱼 发表于 2024-7-22 21:00:18

哇哦,这个真的是蛮实用的呢,收藏夹真的爆满{:6_164:}

kook 发表于 2024-7-22 21:31:50

收藏还少,以后收藏多了就好用了

momohang 发表于 2024-7-22 21:36:38

收藏不够十页,暂时没办法完全发挥这脚本,留着以后用,先谢过了

GMagels 发表于 2024-7-22 21:36:41

Name Match如果有图标还有icon三个都出过错XD 页面加载不用刷新当前已加载内容很方便,不用来回翻了。

MoJIJI 发表于 2024-7-22 21:49:14

技术大佬牛啊{:6_188:}我对自己的收藏夹永远是眼不见心不烦的状态

cdcai 发表于 2024-7-22 21:59:01

收藏帖子很多的坛友应该很需要

毛茸茸兽兽 发表于 2024-7-22 22:11:28

吼(´×ω×`)原来是这样的哇~咱没几个收藏的帖还没遇到过欸

前方无怪 发表于 2024-7-22 22:14:22

挺不错的样子诶!不过咱的收藏夹还挺少的,不过可以以后用啦!很棒的说~

DiederichYH 发表于 2024-7-22 22:25:21

哇,辛苦了。不过我目前还没遇到这种情况

lostorage 发表于 2024-7-22 22:38:40

{:4_86:}是代码佬造福收藏夹多的谭友呢

青藤暮夏 发表于 2024-7-22 22:51:55

我甚至还不知道左右划可以翻页,不过也感谢楼主写脚本啦:loveliness:

Samwise‘Sam’ 发表于 2024-7-22 23:18:46

我也碰到过,我都是直接附件解决的

164895785 发表于 2024-7-23 00:04:57

泥潭的编程大佬好多    ;P    很实用了    虽然我收藏就2页……

威风妖怪麒麟 发表于 2024-7-23 00:42:34

收藏大量帖子的坛友应该是很需要了

黑达克 发表于 2024-7-23 00:46:12

我现在才知道帖子内可以用左右键翻页{:6_165:}
页: [1] 2
查看完整版本: [油猴脚本]我的收藏|收藏页 翻页优化