JS-分页插件

用于对数据分页显示

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/465550/1551954/JS-%E5%88%86%E9%A1%B5%E6%8F%92%E4%BB%B6.js

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

/// <reference path="./DataPaging.d.ts"/>
/* 
数据分页导航
例子

let dataPaging = new DataPaging({
    data: [1, 2, 3, 4, 5, 6, 7, 8, 9],
    pageCount: 3,
    currentPage: 1,
    pageChangeCallBack:function(page){
        console.log(page);
    }
});
dataPaging.append(document.querySelector("body > div"));
*/
(function (global, factory) {
	if (typeof exports === "object" && typeof module !== "undefined") {
		module.exports = factory();
		// @ts-ignore
	} else if (typeof define === "function" && define.amd) {
		// @ts-ignore
		define(factory);
	} else {
		// @ts-ignore
		global = typeof globalThis !== "undefined" ? globalThis : global || self;
		// @ts-ignore
		global.DataPaging = factory();
	}
})(this, function () {
	"use strict";

	class Paging {
		/**
		 * @type {DeepRequired<PagingConfig>}
		 */
		CONFIG = {
			data: [],
			pageCount: 5,
			pageStep: 3,
			currentPage: 1,
			pageChangeCallBack: function (page) {},
			prevBtn: {
				enable: true,
				callBack: function () {},
			},
			nextBtn: {
				enable: true,
				callBack: function () {},
			},
			firstBtn: {
				enable: true,
				callBack: function () {},
			},
			lastBtn: {
				enable: true,
				callBack: function () {},
			},
		};
		PAGE_CONFIG = {
			/**
			 * 获取当前所在页
			 * @returns {Number}
			 */
			getCurrentPage: () => {
				// @ts-ignore
				return this.DOM_CONFIG.getAttributeWithPageId(
					// @ts-ignore
					this.DOM_CONFIG.getAttributeWithCurrentPage()
				);
			},
			/** 最大页码 */
			maxPage: 1,
		};
		DOM_CONFIG = {
			/* 整个分页元素 */
			dataPagingNode: {
				localName: "div",
				id: "whitesev-datapaging",
				dom: null,
			},
			/* 第一页按钮 */
			firstBtnNode: {
				localName: "a",
				className: "pg-first",
				svgHTML: `<svg t="1694497357294" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4758" width="20"><path d="M730.639277 211.376748l60.943177 60.943176-301.698894 301.698893L428.940384 513.075641z" p-id="4759"></path><path d="M730.496772 814.924547l60.943176-60.943176-301.698893-301.698893L428.797879 513.225654z" p-id="4760"></path><path d="M298.666667 213.333333h85.333333v597.333334H298.666667z" p-id="4761"></path></svg>`,
				get: () => {
					// @ts-ignore
					return this.DOM_CONFIG.dataPagingNode.dom.querySelector(
						`${this.DOM_CONFIG.firstBtnNode.localName}.${this.DOM_CONFIG.firstBtnNode.className}`
					);
				},
			},
			/* 上一页按钮 */
			prevBtnNode: {
				localName: "a",
				className: "pg-prev",
				svgHTML: `<svg t="1694497840770" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5272" width="20"><path d="M620.322607 151.04875l60.943176 60.943176-362.038672 362.038672L258.283935 513.087422z" p-id="5273"></path><path d="M620.180101 875.252545l60.943177-60.943176-362.038672-362.038672L258.141429 513.213873z" p-id="5274"></path></svg>`,
				get: () => {
					// @ts-ignore
					return this.DOM_CONFIG.dataPagingNode.dom.querySelector(
						`${this.DOM_CONFIG.prevBtnNode.localName}.${this.DOM_CONFIG.prevBtnNode.className}`
					);
				},
			},
			/* 下一页按钮 */
			nextBtnNode: {
				localName: "a",
				className: "pg-next",
				svgHTML: `<svg t="1694497949481" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5465" width="20"><path d="M403.399239 151.02258l-60.943177 60.943177 362.038672 362.038672L765.437911 513.061252z" p-id="5466"></path><path d="M403.576858 875.263008l-60.943176-60.943176 362.038672-362.038672L765.61553 513.224336z" p-id="5467"></path></svg>`,
				get: () => {
					// @ts-ignore
					return this.DOM_CONFIG.dataPagingNode.dom.querySelector(
						`${this.DOM_CONFIG.nextBtnNode.localName}.${this.DOM_CONFIG.nextBtnNode.className}`
					);
				},
			},
			/* 最后一页按钮 */
			lastBtnNode: {
				localName: "a",
				className: "pg-last",
				svgHTML: `<svg t="1694498035538" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2299" width="20"><path d="M516.266667 490.666667L256 230.4 315.733333 170.666667l320 320L315.733333 810.666667 256 750.933333l260.266667-260.266666zM678.4 170.666667h85.333333v640h-85.333333V170.666667z" p-id="2300"></path></svg>`,
				get: () => {
					// @ts-ignore
					return this.DOM_CONFIG.dataPagingNode.dom.querySelector(
						`${this.DOM_CONFIG.lastBtnNode.localName}.${this.DOM_CONFIG.lastBtnNode.className}`
					);
				},
			},
			/**
			 * 设置 元素的 页码 值
			 * @param {HTMLElement} node
			 */
			// @ts-ignore
			setAttributeWithPageId: (node, page) => {
				node.setAttribute("page-id", page);
			},
			/**
			 * 获取 元素 的页码属性
			 * @param {HTMLElement} node
			 * @returns {number|null}
			 */
			getAttributeWithPageId: (node) => {
				return node?.getAttribute("page-id")
					? // @ts-ignore
					  parseInt(node.getAttribute("page-id"))
					: null;
			},
			/**
			 * 判断 元素 是否存在页码属性
			 * @param {HTMLElement} node
			 * @returns {Boolean}
			 */
			hasAttributeWithPageId: (node) => {
				return node.hasAttribute("page-id");
			},
			/**
			 * 设置 元素的属性 为当前所在页码
			 * @param {HTMLElement} node
			 */
			setAttributeWithCurrentPage: (node) => {
				node.setAttribute("data-current-page", "");
			},
			/**
			 * 获取当前页码的元素
			 * @param {HTMLElement?} dataPagingNode
			 * @returns {HTMLElement|null}
			 */
			getAttributeWithCurrentPage: (dataPagingNode) => {
				return (
					// @ts-ignore
					(dataPagingNode || this.DOM_CONFIG.dataPagingNode.dom).querySelector(
						"a[data-current-page]"
					)
				);
			},
			/**
			 * 判断 元素 是否存在 当前页的属性
			 * @param {HTMLElement} node
			 * @returns
			 */
			hasAttributeWithCurrentPage: (node) => {
				return node.hasAttribute("data-current-page");
			},
			/**
			 * 移除 当前页码的属性
			 * @param {HTMLElement} node
			 */
			removeAttributeWithCurrentPage: (node) => {
				node.removeAttribute("data-current-page");
			},
			/**
			 * 设置 元素 禁用
			 * @param {HTMLElement} node
			 */
			setAttributeWithDisabled: (node) => {
				node.setAttribute("disabled", "true");
			},
			/**
			 * 移除当前页面的禁用的元素
			 * @param {HTMLElement|null} dataPagingNode
			 */
			removeAllAttributeWithDisabled: (dataPagingNode) => {
				// @ts-ignore
				(dataPagingNode || this.DOM_CONFIG.dataPagingNode.dom)
					.querySelectorAll("a[class][disabled]")
					.forEach((item) => {
						item.removeAttribute("disabled");
					});
			},
			/**
			 * 获取 第一页 元素节点
			 * @param {HTMLElement?} dataPagingNode
			 * @returns {HTMLElement|null}
			 */
			getFirstPageNode: (dataPagingNode) => {
				return (
					// @ts-ignore
					(dataPagingNode || this.DOM_CONFIG.dataPagingNode.dom).querySelector(
						"a[page-id='1']"
					)
				);
			},
			/**
			 * 获取 最后一页 元素节点
			 * @param {HTMLElement?} dataPagingNode
			 * @returns {HTMLElement|null}
			 */
			getLastPageNode: (dataPagingNode) => {
				return (
					// @ts-ignore
					(dataPagingNode || this.DOM_CONFIG.dataPagingNode.dom).querySelector(
						`a[page-id='${this.PAGE_CONFIG.maxPage}']`
					)
				);
			},
			/**
			 * 获取当前所有的页码元素节点
			 * @param {HTMLElement?} dataPagingNode
			 * @returns {NodeList}
			 */
			getAllPageNode: (dataPagingNode) => {
				return (
					// @ts-ignore
					(
						dataPagingNode || this.DOM_CONFIG.dataPagingNode.dom
					).querySelectorAll("a[page-id]")
				);
			},
		};
		/**
		 * @param {PagingConfig} details
		 */
		constructor(details) {
			this.changeConfig(details);
		}
		/**
		 * 添加CSS
		 * @param {Node} target 添加到目标元素
		 */
		addCSS(target = document.head) {
			let cssNode = document.createElement("style");
			cssNode.setAttribute("type", "text/css");
			cssNode.innerHTML = /*css*/ `@charset "utf-8";
			#${this.DOM_CONFIG.dataPagingNode.id} {
				text-align: center;
				display: inline-block;
			}
			#${this.DOM_CONFIG.dataPagingNode.id} .${this.DOM_CONFIG.firstBtnNode.className},
			#${this.DOM_CONFIG.dataPagingNode.id} .${this.DOM_CONFIG.prevBtnNode.className},
			#${this.DOM_CONFIG.dataPagingNode.id} .${this.DOM_CONFIG.nextBtnNode.className},
			#${this.DOM_CONFIG.dataPagingNode.id} .${this.DOM_CONFIG.lastBtnNode.className} {
				font-family: Arial, sans-serif;
				color: #333;
				font-size: 22px;
				fill: currentColor;
				display: inline-flex;
				justify-content: center;
				align-items: center;
				text-decoration: none;
			}
			#${this.DOM_CONFIG.dataPagingNode.id} a,
			#${this.DOM_CONFIG.dataPagingNode.id} span {
				width: 45px;
				height: 40px;
				border: 1px solid #ebebeb;
				margin-left: -1px;
				color: #000000;
				line-height: 40px;
				float: left;
				font-size: 15px;
				text-decoration: none;
				margin: 0 2px;
				border-radius: 6px;
			}
			#${this.DOM_CONFIG.dataPagingNode.id} a:hover,
			#${this.DOM_CONFIG.dataPagingNode.id} span:hover {
				border-color: #3897cd;
				color: #3897cd;
				position: relative;
				z-index: 1;
			}
			#${this.DOM_CONFIG.dataPagingNode.id} a {
				cursor: pointer;
				user-select: none;
			}
			#${this.DOM_CONFIG.dataPagingNode.id} a[data-current-page] {
				background-color: #222a35;
				color: #fff;
				border-color: #ebebeb;
				position: relative;
				z-index: 1;
			}
			#${this.DOM_CONFIG.dataPagingNode.id} a.${this.DOM_CONFIG.firstBtnNode.className}[disabled="true"],
			#${this.DOM_CONFIG.dataPagingNode.id} a.${this.DOM_CONFIG.prevBtnNode.className}[disabled="true"],
			#${this.DOM_CONFIG.dataPagingNode.id} a.${this.DOM_CONFIG.nextBtnNode.className}[disabled="true"],
			#${this.DOM_CONFIG.dataPagingNode.id} a.${this.DOM_CONFIG.lastBtnNode.className}[disabled="true"]{
				cursor: not-allowed;
				border: 1px solid transparent;
				color: #c9c9c9;
			}
			`;
			target.appendChild(cssNode);
		}
		/**
		 * 获取分页元素
		 * @returns {Element}
		 */
		getDataPagingNode() {
			let that = this;
			let dataPagingNode = document.createElement(
				that.DOM_CONFIG.dataPagingNode.localName
			);
			// @ts-ignore
			that.DOM_CONFIG.dataPagingNode.dom = dataPagingNode;
			dataPagingNode.id = that.DOM_CONFIG.dataPagingNode.id;
			/* 第一页 */
			let firstBtnNode = document.createElement(
				that.DOM_CONFIG.firstBtnNode.localName
			);
			firstBtnNode.innerHTML = that.DOM_CONFIG.firstBtnNode.svgHTML;
			/* 上一页 */
			let prevBtnNode = document.createElement(
				that.DOM_CONFIG.prevBtnNode.localName
			);
			prevBtnNode.innerHTML = that.DOM_CONFIG.prevBtnNode.svgHTML;
			/* 下一页 */
			let nextBtnNode = document.createElement(
				that.DOM_CONFIG.nextBtnNode.localName
			);
			nextBtnNode.innerHTML = that.DOM_CONFIG.nextBtnNode.svgHTML;
			/* 最后一页 */
			let lastBtnNode = document.createElement(
				that.DOM_CONFIG.lastBtnNode.localName
			);
			lastBtnNode.innerHTML = that.DOM_CONFIG.lastBtnNode.svgHTML;
			firstBtnNode.className = that.DOM_CONFIG.firstBtnNode.className;
			prevBtnNode.className = that.DOM_CONFIG.prevBtnNode.className;
			nextBtnNode.className = that.DOM_CONFIG.nextBtnNode.className;
			lastBtnNode.className = that.DOM_CONFIG.lastBtnNode.className;
			/* 计算总数据量除以显示的数据量 得出分页的数量 */
			that.PAGE_CONFIG.maxPage = Math.ceil(
				that.CONFIG.data.length / that.CONFIG.pageCount
			);
			/* 校正超出或小于的当前页码 */
			if (that.CONFIG.currentPage < 1) {
				that.CONFIG.currentPage = 1;
			} else if (that.CONFIG.currentPage > that.PAGE_CONFIG.maxPage) {
				that.CONFIG.currentPage = that.PAGE_CONFIG.maxPage;
			}
			/* 超过1 才开启分页 */
			if (that.PAGE_CONFIG.maxPage < 2) {
				return dataPagingNode;
			}
			/* 判断第一页按钮 是否开启 */
			if (that.CONFIG.firstBtn.enable) {
				this.setFirstBtnClickEvent(firstBtnNode, dataPagingNode);
				dataPagingNode.appendChild(firstBtnNode);
			}
			/* 判断上一页按钮 是否开启 */
			if (that.CONFIG.prevBtn.enable) {
				this.setPrevBtnClickEvent(prevBtnNode, dataPagingNode);
				dataPagingNode.appendChild(prevBtnNode);
			}
			let currentPage = that.CONFIG.currentPage;
			/* 计算出的最大页码在限制的显示页码数量内 */
			/* 比如计算出的页码总共有5个,设置中当前能显示出的页码按钮元素为3个 */
			if (that.CONFIG.pageStep > that.PAGE_CONFIG.maxPage) {
				for (
					let _currentPage = currentPage;
					_currentPage <= that.PAGE_CONFIG.maxPage;
					_currentPage++
				) {
					let pageBtnNode = document.createElement("a");
					that.DOM_CONFIG.setAttributeWithPageId(pageBtnNode, _currentPage);
					// @ts-ignore
					pageBtnNode.innerText = _currentPage;
					if (that.CONFIG.currentPage === _currentPage) {
						that.DOM_CONFIG.setAttributeWithCurrentPage(pageBtnNode);
					}
					this.setPageBtnClickEvent(pageBtnNode, dataPagingNode);
					dataPagingNode.appendChild(pageBtnNode);
				}
			} else {
				/* 如果 当前页 + 限制显示的页码 大于等于 最大页,那么 从最后一页倒序着添加 */
				if (currentPage + that.CONFIG.pageStep > that.PAGE_CONFIG.maxPage) {
					currentPage = that.PAGE_CONFIG.maxPage;
					/** @type {Node[]} */
					let needAppendNodeList = [];
					for (let index = 0; index < that.CONFIG.pageStep; index++) {
						let pageBtnNode = document.createElement("a");
						that.DOM_CONFIG.setAttributeWithPageId(pageBtnNode, currentPage);
						// @ts-ignore
						pageBtnNode.innerText = currentPage;
						if (that.CONFIG.currentPage === currentPage) {
							that.DOM_CONFIG.setAttributeWithCurrentPage(pageBtnNode);
						}
						this.setPageBtnClickEvent(pageBtnNode, dataPagingNode);
						needAppendNodeList = [...needAppendNodeList, pageBtnNode];
						currentPage--;
					}
					needAppendNodeList.reverse();
					needAppendNodeList.forEach((item) => {
						dataPagingNode.appendChild(item);
					});
				} else {
					/* 当前页 在计算出的页码内 */
					for (let index = 0; index < that.CONFIG.pageStep; index++) {
						let pageBtnNode = document.createElement("a");
						that.DOM_CONFIG.setAttributeWithPageId(pageBtnNode, currentPage);
						// @ts-ignore
						pageBtnNode.innerText = currentPage;
						if (that.CONFIG.currentPage === currentPage) {
							that.DOM_CONFIG.setAttributeWithCurrentPage(pageBtnNode);
						}
						this.setPageBtnClickEvent(pageBtnNode, dataPagingNode);
						dataPagingNode.appendChild(pageBtnNode);
						currentPage++;
					}
				}
			}
			/* 判断下一页按钮 是否开启 */
			if (that.CONFIG.nextBtn.enable) {
				this.setNextBtnClickEvent(nextBtnNode, dataPagingNode);
				dataPagingNode.appendChild(nextBtnNode);
			}
			/* 判断最后一页按钮 是否开启 */
			if (that.CONFIG.lastBtn.enable) {
				this.setLastBtnClickEvent(lastBtnNode, dataPagingNode);
				dataPagingNode.appendChild(lastBtnNode);
			}
			/* 配置中的当前页码为1时 设置 第一页、上一页按钮禁用 */
			if (that.CONFIG.currentPage === 1) {
				that.DOM_CONFIG.setAttributeWithDisabled(
					that.DOM_CONFIG.firstBtnNode.get()
				);
				that.DOM_CONFIG.setAttributeWithDisabled(
					that.DOM_CONFIG.prevBtnNode.get()
				);
			} else if (that.CONFIG.currentPage === that.PAGE_CONFIG.maxPage) {
				/* 如果为最大的页码 下一页、最后一页禁用 */
				that.DOM_CONFIG.setAttributeWithDisabled(
					that.DOM_CONFIG.nextBtnNode.get()
				);
				that.DOM_CONFIG.setAttributeWithDisabled(
					that.DOM_CONFIG.lastBtnNode.get()
				);
			}
			return dataPagingNode;
		}
		/**
		 * 设置 第一页 点击事件
		 * @param {HTMLElement} btnNode 元素
		 * @param {HTMLElement} dataPagingNode 分页元素(主)
		 */
		setFirstBtnClickEvent(btnNode, dataPagingNode) {
			let that = this;
			btnNode.onclick = function () {
				// @ts-ignore
				let currentNode = that.DOM_CONFIG.getAttributeWithCurrentPage();
				/* 当前页为第一页时无效 */
				// @ts-ignore
				if (that.DOM_CONFIG.getAttributeWithPageId(currentNode) === 1) {
					return;
				}
				that.CONFIG.firstBtn.callBack();
				let allPageNode = that.DOM_CONFIG.getAllPageNode(dataPagingNode);
				for (let i = 0; i < that.CONFIG.pageStep; i++) {
					let item = allPageNode[i];
					/* 设置当前页码为第一页 */
					if (i === 0) {
						// @ts-ignore
						that.DOM_CONFIG.setAttributeWithCurrentPage(item);
					} else {
						/* 移除其它设置的第一页 */
						// @ts-ignore
						that.DOM_CONFIG.removeAttributeWithCurrentPage(item);
					}
					// @ts-ignore
					that.DOM_CONFIG.setAttributeWithPageId(item, i + 1);
					// @ts-ignore
					item.innerText = i + 1;
				}
				that.DOM_CONFIG.removeAllAttributeWithDisabled(dataPagingNode);
				/* 可视区域存在第一页的页码时,禁用第一页、上一页按钮 */
				if (that.DOM_CONFIG.getFirstPageNode(dataPagingNode)) {
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.firstBtnNode.get()
					);
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.prevBtnNode.get()
					);
				}
				that.CONFIG.pageChangeCallBack(1);
			};
		}
		/**
		 * 设置 上一页 点击事件
		 * @param {HTMLElement} btnNode 元素
		 * @param {HTMLElement} dataPagingNode 分页元素(主)
		 */
		setPrevBtnClickEvent(btnNode, dataPagingNode) {
			let that = this;
			btnNode.onclick = function () {
				// @ts-ignore
				let currentNode = that.DOM_CONFIG.getAttributeWithCurrentPage();
				/* 当前页为第一页时无效 */
				// @ts-ignore
				if (that.DOM_CONFIG.getAttributeWithPageId(currentNode) === 1) {
					return;
				}
				that.CONFIG.prevBtn.callBack();
				if (
					that.DOM_CONFIG.hasAttributeWithPageId(
						// @ts-ignore
						currentNode.previousElementSibling
					)
				) {
					// @ts-ignore
					currentNode.previousElementSibling.click();
				} else {
					let allPageNode = that.DOM_CONFIG.getAllPageNode(dataPagingNode);
					allPageNode.forEach((item, index) => {
						// @ts-ignore
						let page = that.DOM_CONFIG.getAttributeWithPageId(item);
						// @ts-ignore
						page--;
						// @ts-ignore
						that.DOM_CONFIG.setAttributeWithPageId(item, page);
						// @ts-ignore
						item.innerText = page;
					});
					that.CONFIG.pageChangeCallBack(that.PAGE_CONFIG.getCurrentPage());
				}
				that.DOM_CONFIG.removeAllAttributeWithDisabled(dataPagingNode);
				/* 如果当前第1页可见,且当前所在页不是第1页,则禁用上一页按钮和第一页按钮 */
				if (
					that.DOM_CONFIG.getFirstPageNode(dataPagingNode) &&
					that.PAGE_CONFIG.getCurrentPage() == 1
				) {
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.firstBtnNode.get()
					);
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.prevBtnNode.get()
					);
				}
			};
		}
		/**
		 * 设置 下一页 点击事件
		 * @param {HTMLElement} btnNode 元素
		 * @param {HTMLElement} dataPagingNode 分页元素(主)
		 */
		setNextBtnClickEvent(btnNode, dataPagingNode) {
			let that = this;
			btnNode.onclick = function () {
				// @ts-ignore
				let currentNode = that.DOM_CONFIG.getAttributeWithCurrentPage();
				/* 当前页出于最后一页时 无效点击 */
				if (
					// @ts-ignore
					that.DOM_CONFIG.getAttributeWithPageId(currentNode) ===
					that.PAGE_CONFIG.maxPage
				) {
					return;
				}
				that.CONFIG.nextBtn.callBack();
				/* 如果后面的按钮存在页码属性 点击 */
				if (
					// @ts-ignore
					that.DOM_CONFIG.hasAttributeWithPageId(currentNode.nextElementSibling)
				) {
					// @ts-ignore
					currentNode.nextElementSibling.click();
				} else {
					let allPageNode = that.DOM_CONFIG.getAllPageNode(dataPagingNode);
					allPageNode.forEach((item, index) => {
						// @ts-ignore
						let page = that.DOM_CONFIG.getAttributeWithPageId(item);
						// @ts-ignore
						page++;
						// @ts-ignore
						if (page > that.PAGE_CONFIG.maxPage) {
							return;
						}
						// @ts-ignore
						that.DOM_CONFIG.setAttributeWithPageId(item, page);
						// @ts-ignore
						item.innerText = page;
					});
					that.CONFIG.pageChangeCallBack(that.PAGE_CONFIG.getCurrentPage());
				}
				that.DOM_CONFIG.removeAllAttributeWithDisabled(dataPagingNode);
				if (
					// @ts-ignore
					that.DOM_CONFIG.getLastPageNode() &&
					that.PAGE_CONFIG.getCurrentPage() == that.PAGE_CONFIG.maxPage
				) {
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.nextBtnNode.get()
					);
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.lastBtnNode.get()
					);
				}
			};
		}
		/**
		 * 设置 最后一页 点击事件
		 * @param {HTMLElement} btnNode 元素
		 * @param {HTMLElement} dataPagingNode 分页元素(主)
		 */
		setLastBtnClickEvent(btnNode, dataPagingNode) {
			let that = this;
			btnNode.onclick = function () {
				// @ts-ignore
				let currentNode = that.DOM_CONFIG.getAttributeWithCurrentPage();
				if (
					// @ts-ignore
					that.DOM_CONFIG.getAttributeWithPageId(currentNode) ===
					that.PAGE_CONFIG.maxPage
				) {
					return;
				}
				that.CONFIG.lastBtn.callBack();
				let allPageNode = Array.from(
					that.DOM_CONFIG.getAllPageNode(dataPagingNode)
				);
				allPageNode.reverse();
				let pageCount = that.PAGE_CONFIG.maxPage;
				let index = 0;
				while (true) {
					if (that.PAGE_CONFIG.maxPage - pageCount > 3) {
						break;
					}
					let item = allPageNode[index];
					if (item == null) {
						break;
					}
					if (index === 0) {
						// @ts-ignore
						that.DOM_CONFIG.setAttributeWithCurrentPage(item);
					} else {
						// @ts-ignore
						that.DOM_CONFIG.removeAttributeWithCurrentPage(item);
					}

					// @ts-ignore
					that.DOM_CONFIG.setAttributeWithPageId(item, pageCount);
					// @ts-ignore
					item.innerText = pageCount;
					pageCount--;
					index++;
				}
				that.DOM_CONFIG.removeAllAttributeWithDisabled(dataPagingNode);
				that.DOM_CONFIG.setAttributeWithDisabled(
					that.DOM_CONFIG.nextBtnNode.get()
				);
				that.DOM_CONFIG.setAttributeWithDisabled(
					that.DOM_CONFIG.lastBtnNode.get()
				);
				that.CONFIG.pageChangeCallBack(that.PAGE_CONFIG.maxPage);
			};
		}
		/**
		 * 设置 页 点击事件
		 * @param {HTMLElement} btnNode 元素
		 * @param {HTMLElement} dataPagingNode 分页元素(主)
		 * @this {Paging}
		 */
		setPageBtnClickEvent(btnNode, dataPagingNode) {
			let that = this;
			btnNode.onclick = function (event) {
				let eventBtnNode = event.target;
				that.DOM_CONFIG.getAllPageNode(dataPagingNode).forEach((item) => {
					/* 是当前点击的页码 */
					if (item == eventBtnNode) {
						/* 如果 当前点击的页码不是current */
						// @ts-ignore
						if (!that.DOM_CONFIG.hasAttributeWithCurrentPage(eventBtnNode)) {
							// @ts-ignore
							that.DOM_CONFIG.setAttributeWithCurrentPage(eventBtnNode);
							that.CONFIG.pageChangeCallBack(that.PAGE_CONFIG.getCurrentPage());
						}
					} else {
						// @ts-ignore
						that.DOM_CONFIG.removeAttributeWithCurrentPage(item);
					}
				});
				that.DOM_CONFIG.removeAllAttributeWithDisabled(dataPagingNode);
				/* 如果当前第1页可见,且当前所在页不是第1页,则禁用上一页按钮和第一页按钮 */
				if (
					that.DOM_CONFIG.getFirstPageNode(dataPagingNode) &&
					that.PAGE_CONFIG.getCurrentPage() == 1
				) {
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.firstBtnNode.get()
					);
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.prevBtnNode.get()
					);
				}
				/* 如果当前最后一页可见,且当前所在页不是最后一页,则禁用下一页按钮和最后一页按钮 */
				if (
					// @ts-ignore
					that.DOM_CONFIG.getLastPageNode() &&
					that.PAGE_CONFIG.getCurrentPage() == that.PAGE_CONFIG.maxPage
				) {
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.nextBtnNode.get()
					);
					that.DOM_CONFIG.setAttributeWithDisabled(
						that.DOM_CONFIG.lastBtnNode.get()
					);
				}
			};
		}
		/**
		 * 把分页添加到某个父元素下
		 * @param {Node} parentNode
		 */
		append(parentNode) {
			let that = this;
			// @ts-ignore
			that.DOM_CONFIG.dataPagingNode.dom?.remove();
			that.DOM_CONFIG.dataPagingNode.dom = null;
			parentNode.appendChild(that.getDataPagingNode());
		}

		/**
		 * 动态修改配置,注意,修改后需要.append修改原来的元素
		 * @param {PagingConfig} details 配置
		 */
		changeConfig(details) {
			Object.assign(this.CONFIG, details);
		}

		/**
		 * 刷新页面
		 * 当总页数5页,当前在第3页,把第3页的数据删完,后面2页的数据会自动往前,需要重新计算数据
		 * 且重新计算的数据的页数大于当前页(第3页)时,当前页不变,若小于当前页(第3页),则当前页为计算好的最大页
		 * @param {PagingConfig["data"]} data 新的数据
		 */
		refresh(data) {
			if (data.length === this.CONFIG.data.length) {
				return;
			}
			this.CONFIG.data = [];
			// @ts-ignore
			this.CONFIG.data = data;
			let currentPage = this.PAGE_CONFIG.getCurrentPage();
			let maxPage = Math.ceil(data.length / this.CONFIG.pageCount);
			if (currentPage > maxPage) {
				currentPage = maxPage;
			}
			this.CONFIG.currentPage = currentPage;
			// @ts-ignore
			let parentElement = this.DOM_CONFIG.dataPagingNode.dom.parentElement;
			this.append(parentElement);
		}
	}
	return Paging;
});