您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
infinite scroll
当前为
// ==UserScript== // @name pagination-manager // @description infinite scroll // @namespace Violentmonkey Scripts // @author smartacephale // @license MIT // @version 1.41 // @match *://*/* // @grant unsafeWindow // ==/UserScript== class PaginationManager { /** * @param {Vue.reactive} state * @param {Vue.reactive} stateLocale * @param {Rules} rules - WEBSITE_RULES class with methods: * - URL_DATA { iteratable_url, offset }, * - PAGINATION_LAST * @param {Function} handleHtmlCallback * @param {number} delay - milliseconds * @param {Function} [alternativeGenerator] - Optional custom generator function */ constructor(state, stateLocale, rules, handleHtmlCallback, delay, alternativeGenerator) { const { offset, iteratable_url } = rules.URL_DATA(); Object.assign(this, { state, stateLocale, rules, handleHtmlCallback, delay }); Object.assign(this, { pagIndexLast: rules.PAGINATION_LAST, pagIndexCur: offset }); this.paginationGenerator = alternativeGenerator?.() ?? PaginationManager.createPaginationGenerator(offset, rules.PAGINATION_LAST, iteratable_url); this.createPaginationObserver(); } createPaginationObserver() { const observable = this.rules.INTERSECTION_OBSERVABLE || this.rules.PAGINATION; unsafeWindow.bhutils.Observer.observeWhile(observable, this.generatorConsumer, this.delay); } generatorConsumer = async () => { if (!this.state.infiniteScrollEnabled) return; const { value: { url, offset } = {}, done } = await this.paginationGenerator.next(); if (!done) { console.log(url); const nextPageHTML = await unsafeWindow.bhutils.fetchHtml(url); const prevScrollPos = document.documentElement.scrollTop; this.handleHtmlCallback(nextPageHTML); this.stateLocale.pagIndexCur = offset; window.scrollTo(0, prevScrollPos); } return !done; } static * createPaginationGenerator(currentPage, totalPages, generateURL) { for (let p = currentPage + 1; p <= totalPages; p++) { const url = generateURL(p); yield { url, offset: p }; } } }