JS-分页插件

用于对数据分页显示

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greasyfork.org/scripts/465550/1448580/JS-%E5%88%86%E9%A1%B5%E6%8F%92%E4%BB%B6.js

// @ts-check
/// <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) {
	typeof exports === "object" && typeof module !== "undefined"
		? (module.exports = factory())
		: // @ts-ignore
		typeof define === "function" && define.amd
		? // @ts-ignore
		  define(factory)
		: // @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: #8a8a8a;
			}
			`;
			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;
});