Greasy Fork is available in English.

豆瓣电影列表翻页

增加自动加载和翻页功能

// ==UserScript==
// @name         豆瓣电影列表翻页
// @namespace    https://greasyfork.org/zh-CN/scripts/396471-%E8%B1%86%E7%93%A3%E7%94%B5%E5%BD%B1%E5%88%97%E8%A1%A8%E7%BF%BB%E9%A1%B5
// @version      0.11
// @description  增加自动加载和翻页功能
// @author       Hugo16
// @match        https://movie.douban.com/explore
// @match        https://movie.douban.com/tag/*
// @require      http://code.jquery.com/jquery-1.7.2.min.js
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';
    // 供全局使用的url
    let url = { url: "" };
    // 获取请求的地址
    let open = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function (...args) {
        open.apply(this, args);
        url.url = args[1];
    }

    //添加页面按钮
    let btn1 = $('<button class="db_btn" >原始模式</button>');
    let btn2 = $('<button class="db_btn" >自动加载</button>');
    let btn3 = $('<button class="db_btn" >翻页模式</button>');
    let btnBox = $('<div class="db_btn_box" ></div>');
    btnBox.append(btn1, btn2, btn3);
    $('body').append(btnBox);

    // 读取设置
    let config = null;
    let cookieIndex = document.cookie.indexOf('dbMode=')
    if (cookieIndex > -1) {
        config = document.cookie.slice(cookieIndex + 7, cookieIndex + 8);
        switch (config) {
            case '0': btn1.css('color', 'yellow'); break;
            case '1': btn2.css('color', 'yellow'); autoScroll(); break;
            case '2': btn3.css('color', 'yellow'); pageMode(url); break;
        }
    }
    else {
        document.cookie = 'dbMode=0';
        btn1.css('color', 'yellow');
    }

    // 原始模式
    btn1.on('click', function () {
        if (config == 0) return;
        document.cookie = 'dbMode=0';
        window.location.reload();
    });

    // 自动加载
    btn2.on('click', function () {
        if (config == 1) return;
        document.cookie = 'dbMode=1';
        window.location.reload();
    });

    // 翻页模式
    btn3.on('click', function () {
        if (config == 2) return;
        document.cookie = 'dbMode=2';
        btn3.css('color', 'yellow').siblings().css('color', 'white');
        // 清除其他模式
        window.onscroll = null;
        pageMode(url);
        config = 2;
    })
})();

function autoScroll() {
    window.onscroll = function () {
        if ($(document).scrollTop() >= $(document).height() - $(window).height()) {
            $('a.more')[0].click();
        }
    };
}

function pageMode(url) {
    let pageStart, pageLimit, pageIndex, pagePre, pageNext, nowIndex, pageGo, indexWrap, pageWrap;
    // 分类页面所需参数
    let tags, genres, countries, year_range, sort, range;
    let waiting = false;
    // 计算当前页数
    // 区分找电影和分类两个网址
    if (window.location.href.indexOf('explore') >= 0) {
        pageStart = window.location.hash.match(/page_start=\d+/)[0].split('=')[1];
        pageLimit = window.location.hash.match(/page_limit=\d+/)[0].split('=')[1];
        pageIndex = pageStart / pageLimit + 1;
    }
    else {
        pageStart = 0;
        pageIndex = 1;
        $(".article .tags").on("click", function () {
            window.location.reload();
        })
    }
    // 添加按键
    pagePre = $('<button class="db_btn_page" >上一页</button>');
    pageNext = $('<button class="db_btn_page" >下一页</button>');
    nowIndex = $('<input class="db_input" disabled value=' + pageIndex + ' />');
    pageGo = $('<button class="db_btn_go" >跳转</button>');
    indexWrap = $('<div></div>');
    indexWrap.append(nowIndex, pageGo);
    pageWrap = $('<div class="db_page_wrap"></div>');
    pageWrap.append(pagePre, indexWrap, pageNext)
    function appendEle() {
        if ($('a.more').length > 0) {
            $($('a.more')[0]).after(pageWrap);
            $($('a.more')[0]).remove();
        }
        else {
            setTimeout(() => {
                appendEle();
            }, 50);
        }
    }
    appendEle();
    // 输入框移入可以输入
    indexWrap.on('mouseover', function () {
        nowIndex.removeAttr('disabled');
    })
    indexWrap.on('mouseout', function () {
        nowIndex.attr('disabled', 'disabled');
    })
    // 输入框只能输入数字
    $(nowIndex[0]).on('input', function () {
        this.value = this.value.match(/^\d+/);
    });
    // 跳转按钮
    pageGo.on('click', function () {
        if (waiting) return;
        getDataByPageIndex(nowIndex[0].value, pageLimit, url);
    })

    // 上一页按钮
    pagePre.on('click', function () {
        if (waiting) return;
        nowIndex[0].value = nowIndex[0].value <= 1 ? 1 : nowIndex[0].value * 1 - 1;
        getDataByPageIndex(nowIndex[0].value, pageLimit, url);
    })

    // 下一页按钮
    pageNext.on('click', function () {
        if (waiting) return;
        nowIndex[0].value = nowIndex[0].value * 1 + 1;
        getDataByPageIndex(nowIndex[0].value, pageLimit, url);
    })

    // 重新选择分类时还原索引
    $('div.sort').on('click', function () {
        nowIndex[0].value = 1;
    });
    $('div.tags').on('click', function () {
        nowIndex[0].value = 1;
    });
    $('div.tag-nav').on('click', function () {
        nowIndex[0].value = 1;
    })
}

function getDataByPageIndex(index, limit, url) {
    // 禁止按钮再次点击
    waiting = true;
    if (index <= 0) index = 1;
    // 整理网址并且获取数据
    // 区分找电影和分类两个网址
    if (window.location.href.indexOf('explore') >= 0) {
        let replaceStr = window.location.hash.match(/page_start=\d+/)[0];
        url.url = window.location.href.replace(replaceStr, 'page_start=' + (index - 1) * limit).replace('/explore#!', '/j/search_subjects?');
    }
    else {
        if (url.url) {
            url.url = url.url.replace(/start=\d+/, 'start=' + ((index - 1) * 20 + 1));
        }
        else {
            url.url = 'https://movie.douban.com/j/new_search_subjects?start=0&' + window.location.href.split('?')[1];
        }
    }
    let res = $.ajax({ url: url.url, async: false });
    let data;
    if (window.location.href.indexOf('explore') >= 0) {
        data = JSON.parse(res.responseText).subjects;
    }
    else {
        data = JSON.parse(res.responseText).data;
    }

    // 清空容器并填充新的数据
    if (window.location.href.indexOf('explore') >= 0) {
        $('div.list-wp div.list').empty();
    } else {
        $('div.article div.list-wp').empty();
    }
    for (let i = 0; i < data.length; i++) {
        if (window.location.href.indexOf('explore') >= 0) {
            let newItem = $('<a class="item" target="_blank" href="' + data[i].url
                + '?tag=热门&amp;from=gaia"><div class="cover-wp" data-isnew="' + data[i]['is_new']
                + '" data-id="' + data[i].id
                + '"><img src="' + data[i].cover
                + '" alt="' + data[i].title
                + '" data-x="' + data[i]['cover_x']
                + '" data-y="' + data[i]['cover_y']
                + '"></div><p>'
                + data[i].title
                + '<strong>' + data[i].rate
                + '</strong></p></a>');
            $('div.list-wp div.list').append(newItem);
        } else {
            let newItem = $('<a class="db_class_a" target="_blank" href="' + data[i].url
                + '?tag=热门&amp;from=gaia"><div style="background-size: 100%;height: 161px;overflow: hidden;position: relative;" data-isnew="' + data[i]['is_new']
                + '" data-id="' + data[i].id
                + '"><span style="display: inline-block;"><img style="width: 115px;" src="' + data[i].cover
                + '" alt="' + data[i].title
                + '" data-x="' + data[i]['cover_x']
                + '" data-y="' + data[i]['cover_y']
                + '"></span></div><p style="overflow: hidden;color: #333;line-height: 18px;padding-right: 15px;margin: 8px 0 20px;">'
                + '<span style="margin-right: 5px;">' + data[i].title
                + '</span><span style="color: #ffac2d;">' + data[i].rate
                + '</span></p></a>');
            $('div.article div.list-wp').append(newItem);
        }
    }

    // 滚动到顶部
    $("html,body").animate({
        scrollTop: 0
    }, 500);

    // 可以再次点击
    waiting = false;
}

GM_addStyle(".db_btn{padding:10px 10px 10px 0;color:white;border:none;background-color: #4b8ccb;cursor: pointer;}"
    + ".db_btn:nth-child(2){margin:1px 0}"
    + ".db_btn_box{z-index:999;position:fixed;left:-80px;top:50%;display:flex;flex-direction:column;width: 90px;border-radius: 0 5px 5px 0;overflow: hidden;transition: left 0.3s;background-color:white;}"
    + ".db_btn_box:hover{left:0;}"
    + ".db_page_wrap{display:flex;justify-content: space-between;}"
    + ".db_btn_page{background:#f7f7f7;color:#37a;padding:5px;border:none;width:30%;cursor:pointer}"
    + ".db_btn_page:hover{background:#eee;}"
    + ".db_btn_go{background:#f7f7f7;color:#37a;padding:5px;border:none;cursor:pointer}"
    + ".db_btn_go:hover{background:#eee;}"
    + ".db_input{width:50px;text-align:center}"
    + ".db_class_a{display: inline-block;vertical-align: top;font-size: 13px;text-align: left;padding: 0;width: 140px;}"
    + ".db_class_a:hover{background:#FFF !important}")