封装个js分页插件

// 分页插件类
class PaginationPlugin {
  constructor(fetchDataURL, options = {}) {
    this.fetchDataURL = fetchDataURL;
    this.options = {
      containerId: options.containerId || 'paginationContainer',
           dataSizeAttr: options.dataSizeAttr || 'toatalsize', // 修改为实际API返回的数据属性名
           pageSizeAttr: options.pageSizeAttr || 'size',
           onPageChange: options.onPageChange || (() => {}),
    };
	this.paginationData = {};
	this.totalPages=0;
  }

  async init() {
      const initialData = await this.fetchData(1);
      this.paginationData = initialData;
	  this.totalPages=initialData.data.totalpage;
      this.options.onPageChange(initialData);
      this.createPagination(this.options.containerId);
      this.bindEventListeners(this.options.containerId);
    }
  createPagination(containerId) {
    // ... 保留原有的创建分页组件逻辑 ..
	const container = document.getElementById(containerId);
	container.innerHTML=''
	// 创建上一页按钮
	const prevPageButton = document.createElement('button');
	prevPageButton.id = 'prevPage';
	prevPageButton.textContent = '上一页';
	prevPageButton.classList.add('bg-blue-200','w-14', 'hover:bg-blue-700', 'text-white','text-sm',  'py-1', 'px-1', 'rounded', 'ml-2');
		
	// 创建下一页按钮
	const nextPageButton = document.createElement('button');
	nextPageButton.id = 'nextPage';
	nextPageButton.textContent = '下一页';
	nextPageButton.classList.add('bg-blue-500', 'w-14','hover:bg-blue-700', 'text-white', 'text-sm','py-1', 'px-1', 'rounded', 'ml-2');
		
	// 创建跳转按钮
	const gotoPageButton = document.createElement('button');
	gotoPageButton.id = 'gotoPageButton';
	gotoPageButton.textContent = '跳转';
	gotoPageButton.classList.add('bg-blue-500','w-14', 'hover:bg-blue-700', 'text-white', 'text-sm', 'py-1', 'px-1', 'rounded', 'ml-2');
		
	// 创建输入框
	const gotoPageInput = document.createElement('input');
	gotoPageInput.id = 'gotoPageInput';
	gotoPageInput.type = 'number';
	gotoPageInput.placeholder = '页码';
	gotoPageInput.classList.add('w-16', 'p-1', 'mt-1', 'border','text-sm', 'border-gray-300', 'rounded-md', 'ml-2');
		
	// 创建分页按钮容器
	const paginationContainer = document.createElement('div');
	paginationContainer.id = 'pagination';
	paginationContainer.classList.add('flex', 'justify-center');
		
	
	  // 创建分页按钮列表
	let pages = [];
	const visibleRange = 5; // 显示5个完整页码
	const halfVisibleRange = Math.floor(visibleRange / 2); // 对称显示,一半数量的完整页码
	
	if (this.totalPages > visibleRange) {
	  // 开始页码
	  let startPage = this.paginationData.data.page - halfVisibleRange;
	  if (startPage <= 0) {
	    startPage = 1;
	  }
	  
	  // 结束页码
	  let endPage = this.paginationData.data.page + halfVisibleRange;
	  if (endPage > this.totalPages) {
	    endPage = this.totalPages;
	    startPage = Math.max(startPage - (endPage - this.totalPages), 1);
	  }
	
	  // 添加开始页码之前的页码
	  if (startPage > 1) {
	    pages.push(1);
	    if (startPage > 2) {
	      pages.push('...');
	    }
	  }
	  // 添加中间页码
	  for (let i = startPage; i <= endPage; i++) {
	    pages.push(i);
	  }
	  // 添加结束页码之后的页码
	  if (endPage < this.totalPages) {
	    pages.push('...');
	    pages.push(this.totalPages);
	  }
	} else {
	  for (let i = 1; i <= this.totalPages; i++) {
	    pages.push(i);
	  }
	}
	  pages.forEach((page) => {
	    const button = document.createElement('button');
	    button.id = `page-${page}`;
	    button.textContent = page;
	    button.classList.add('px-4', 'py-1', 'border', 'border-gray-300','text-sm', 'rounded-md', 'text-gray-700','ml-1',);
	
	    if (page === this.paginationData.data.page) {
		  button.classList.remove('text-gray-700');
	      button.classList.add('bg-blue-500', 'text-white');
	    }
	
	    paginationContainer.appendChild(button);
	  });
		
	// 创建分页信息容器
	const pageInfoContainer = document.createElement('div');
	pageInfoContainer.id = 'pageInfoContainer';
	pageInfoContainer.classList.add('flex',  'text-sm','justify-end');
		
	// 创建分页信息
	const pageInfo = document.createElement('span');
	pageInfo.id = 'pageInfo';
	pageInfo.textContent = `共 ${paginationData.data.toatalsize} 条记录,每页 ${paginationData.data.size} 条记录,当前第 ${paginationData.data.page} 页,共${paginationData.data.totalpage}页`;
	pageInfoContainer.appendChild(pageInfo);
	pageInfo.classList.add('ml-2','mt-2');
	// 创建跳转到第一页按钮
	const firstPageButton = document.createElement('button');
	firstPageButton.id = 'firstPageButton';
	firstPageButton.textContent = '首页';
	firstPageButton.classList.add('bg-blue-500','w-14', 'hover:bg-blue-700', 'text-white','text-sm',  'py-1', 'px-1', 'rounded', 'ml-2');
	pageInfoContainer.appendChild(firstPageButton);
		
	// 创建跳转到最后一页按钮
	const lastPageButton = document.createElement('button');
	lastPageButton.id = 'lastPageButton';
	lastPageButton.textContent = '尾页';
	lastPageButton.classList.add('bg-blue-500','w-14', 'hover:bg-blue-700', 'text-white','text-sm',  'py-1', 'px-1', 'rounded', 'ml-2');
	pageInfoContainer.appendChild(lastPageButton);
		
	// 将所有元素添加到容器中
	container.appendChild(prevPageButton);
	container.appendChild(nextPageButton);
	container.appendChild(gotoPageInput);
	container.appendChild(gotoPageButton);
	container.appendChild(paginationContainer);
	container.appendChild(pageInfoContainer);
  }

	
	// 更新选中的分页按钮
	 updateSelectedPage(page, containerId) {
	  const container = document.getElementById(containerId);
	  const buttons = container.querySelectorAll('#pagination button');
	 
	  buttons.forEach((button) => {
	    if (button.id === `page-${page}`) {
		   button.classList.remove('text-gray-700');
	       button.classList.add('bg-blue-500', 'text-white');
	    } else {
		  button.classList.add('text-gray-700');
	      button.classList.remove('bg-blue-500', 'text-white');
	    }
	  });
	}
	
	
  bindEventListeners(containerId) {
	  const prevPageButton = document.getElementById('prevPage');
	  const nextPageButton = document.getElementById('nextPage');
	  const gotoPageButton = document.getElementById('gotoPageButton');
	  const gotoPageInput = document.getElementById('gotoPageInput');
	  const pageInfoContainer = document.getElementById('pageInfoContainer');
	  const firstPageButton = document.getElementById('firstPageButton');
	  const lastPageButton = document.getElementById('lastPageButton');
	  	
	  prevPageButton.addEventListener('click',async () => {
	    const currentPage = parseInt(this.paginationData.data.page);
	  		if(currentPage==2){
	  			prevPageButton.classList.add('bg-blue-200');
	  			prevPageButton.classList.remove('bg-blue-500');
	  		}
	  		if(currentPage==1){
	  		  alert("已经是第一页了");
	  		  return;
	  		}
	    if (currentPage > 1) {
	      this.paginationData.data.page = currentPage - 1;
		  const initialData =await  this.fetchData(  this.paginationData.data.page);
		  this.paginationData = initialData;
		  this.totalPages=initialData.data.totalpage;
		  this.options.onPageChange(initialData);
		  this.createPagination(this.options.containerId);
		  this.bindEventListeners(this.options.containerId);
		  this.updateSelectedPage(this.paginationData.data.page,containerId)
	    }
	  });
	  	
	  nextPageButton.addEventListener('click', async() => {
	    const currentPage = parseInt(this.paginationData.data.page);
	  		 if( currentPage==this.totalPages){
	  			  alert("已经是最后一页了");
	  			  return;
	  		 }
	  			   prevPageButton.classList.remove('bg-blue-200');
	  		 	   prevPageButton.classList.add('bg-blue-500');
	    if (currentPage < this.totalPages) {
			 const initialData =await  this.fetchData( this.paginationData.data.page);
			this.paginationData = initialData;
			this.totalPages=initialData.data.totalpage;
			this.paginationData.data.page = currentPage + 1;
			this.options.onPageChange(initialData);
			this.createPagination(this.options.containerId);
			this.bindEventListeners(this.options.containerId);
			this.updateSelectedPage(this.paginationData.data.page,containerId)
			
	    }
		
		
	  });
	  	
	  gotoPageButton.addEventListener('click', async() => {
	    const input = document.getElementById('gotoPageInput');
	    const page = parseInt(input.value);
	    if (!isNaN(page) && page > 0 && page <= this.totalPages) {
		   const initialData =await  this.fetchData(page);
		   this.paginationData = initialData;
		   this.totalPages=initialData.data.totalpage;
		   this.paginationData.data.page = page;
		   this.options.onPageChange(initialData);
		   this.createPagination(this.options.containerId);
		   this.bindEventListeners(this.options.containerId);
		 
	    }
	  });
	  	
	  firstPageButton.addEventListener('click', async() => {
	    this.paginationData.data.page = 1;
		const initialData =await  this.fetchData(this.paginationData.data.page);
		 this.paginationData = initialData;
		 this.totalPages=initialData.data.totalpage;
		 this.options.onPageChange(initialData);
		 this.createPagination(this.options.containerId);
		 this.bindEventListeners(this.options.containerId);
	  });
	  	
	  lastPageButton.addEventListener('click',async () => {
		
		const initialData =await  this.fetchData(this.totalPages);
		this.paginationData = initialData;
		this.totalPages=initialData.data.totalpage;
		this.paginationData.data.page = this.totalPages;
		this.options.onPageChange(initialData);
		this.createPagination(this.options.containerId);
		this.bindEventListeners(this.options.containerId);
		
		
	  });
	  
    // ... 保留原有的事件绑定逻辑 ...
    const paginationButtons = document.querySelectorAll(`#${containerId} button[id^="page-"]`);
    paginationButtons.forEach((button) => {
      button.addEventListener('click', async (event) => {
        const targetPage = parseInt(event.target.id.replace('page-', ''));
        const initialData = await this.fetchData(targetPage);
		this.paginationData = initialData;
		this.totalPages=initialData.data.totalpage;
		this.paginationData.data.page =targetPage;
		this.options.onPageChange(initialData);
		this.createPagination(this.options.containerId);
		this.bindEventListeners(this.options.containerId);
		
      });
    });
  }

async fetchData(page) {
  const url = `${this.fetchDataURL}&page=${page}&size=10`;
  try {
    const response = await fetch(url);
    const jsonData = await response.json();
    return jsonData;
  } catch (error) {
    console.error('There has been a problem with your fetch operation:', error);
    return null;
  }
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 的 showDialog 和 showCupertinoDialog 有什么区别?

我将我的 App 里用的 Flutter 升级到了 3.19&#xff0c;没想到&#xff0c;以前我用 showDialog 和 AlertDialog 组合创建的二次确认框&#xff0c;变得无敌难看了&#xff0c;大幅度增加了整个框的圆角和里面默认按钮的圆角。不得已&#xff0c;我必须修改一下&#xff0c;以…

51.基于SpringBoot + Vue实现的前后端分离-校园志愿者管理系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的校园志愿者管理系统设计与实现管理工…

偏微分方程算法之二维初边值问题(紧交替方向隐格式)

目录 一、研究对象 二、理论推导 2.1 二维紧差分格式 2.2 紧交替方向格式 2.2.1 紧Peaceman-Rachford格式 2.2.2 紧D’Yakonov格式 2.2.3 紧Douglas格式 三、算例实现 四、结论 一、研究对象 继续以二维抛物型方程初边值问题为研究对象: 为了确保连续性,公式…

Vue.extend()和我的两米大砍刀

Vue.extends是什么&#xff1f; 一个全局API,用于注册并挂载组件。 传统的引用组件的方式是使用import直接引入&#xff0c;但是使用Vue.extends()也可以实现。 使用规则 <div id"mount-point"></div>// 创建构造器 var Profile Vue.extend({templat…

PyCharm,终端conda环境无法切换的问题(二个解决方案)

问题 PyCharm终端&#xff0c;环境切换无效&#xff0c;默认始终为base 解决一 Settings->Tools->Terminal->ShellPath&#xff0c;将powershell修改为cmd.exe 解决二 conda config --show在输出中找到 auto_activate_base 的行&#xff0c;发现被设置为 true&#x…

R语言中的execl数据转plink

文章目录 带出外部连接的方式添加列的方式从列表中选出对应的数据信息查看变量信息没有成功 带出外部连接的方式 点击这个黄色的按钮就可以弹出外部链接的方式 添加列的方式 创建一个数据框的方式 我们创建一个三行三列的数据方式 df <- data.frame(name c("Alice&…

嵌入式linux中利用QT控制蜂鸣器方法

大家好,今天给大家分享一下,如何控制开发板上的蜂鸣器。 第一:开发板原理图 从原理图中可以得出,当引脚输出低电平的时候,对应的蜂鸣器发出响声。 第二:QT代码详细实现 设置一个按钮,点击即可控制BEEP状态发生反转。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#in…

【网络编程】TCP流套接字编程(TCP实现回显服务器)

一.TCP流套字节相关API. Socket(既能给客户端使用,也能给服务器使用) 构造方法 基本方法: ServerSocket(只能给服务器使用) 构造方法: 基本方法: 二.TCP实现回显服务器. 客户端代码示例: package Demo2;import java.io.IOException; import java.io.InputStream; import j…

【飞桨AI实战】人体姿态估计:零基础入门,从模型训练到应用开发

前言 本次分享将带领大家从 0 到 1 完成一个人体姿态估计任务&#xff0c;覆盖数据准备、模型训练、推理部署和应用开发的全流程&#xff0c;项目将采用以PaddlePaddle为核心的飞桨深度学习框架进行开发&#xff0c;并总结开发过程中踩过的一些坑&#xff0c;希望能为有类似项…

(C语言)sscanf 与 sprintf详解

目录 1.sprintf函数详解 2. sscanf函数详解 1.sprintf函数详解 头文件&#xff1a;stdio.h 作用&#xff1a;将格式化的数据写入字符串里&#xff0c;也就是将格式化的数据转变为字符串。 演示&#xff1a; #include <stdio.h> struct S {char name[10];int height;…

【Gradle如何安装配置及使用的教程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【笔记】应对Chrome更新导致Chromedriver失效的解决方案:Chrome For Test

随着网络应用和网站的不断发展&#xff0c;自动化测试变得越来越重要&#xff0c;而Selenium成为了许多开发者和测试人员的首选工具之一。然而&#xff0c;对于使用Selenium来进行网站测试的人来说&#xff0c;Chrome浏览器的频繁更新可能会成为一个头疼的问题。每当Chrome更新…

有的爆炸,有的爆冷!盘点那些爆冷的985院校

今年计算机普遍很炸&#xff0c;专硕学硕分都很高。大热门&#xff0b;非常多跨考。 不管是自命题还是408&#xff0c;大家考完都说难&#xff0c;但是一出分&#xff0c;个个350&#xff0c;非常卷。 报中下211&#xff0c;专硕分数要要330才稳一点&#xff0c;中上211则直逼3…

MySQL数据库外键约束打开与关闭 ️

MySQL数据库外键约束打开与关闭 &#x1f6e0;️ MySQL数据库外键约束打开与关闭 &#x1f6e0;️摘要 &#x1f4dd;引言 &#x1f680;正文内容&#xff08;详细介绍&#xff09; &#x1f4a1;关闭外键约束检查外键约束检查关闭的作用风险与最佳实践建议 &#x1f914; QA环…

Java数据结构-堆和优先级队列

目录 1. 相关概念2. PriorityQueue的实现2.0 搭建整体框架2.1 堆的创建和调整2.2 插入元素2.3 出堆顶元素 3. 全部代码&#xff08;包含大根堆和小根堆&#xff09;4. PriorityQueue的使用5. Top-K问题 之前我们学习的二叉树的存储方式是链式存储&#xff0c;&#xff08;不清楚…

idm线程越多越好吗 idm线程数多少合适

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的下载管理软件&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM…

LeetCode刷题实战5:最长回文子串

题目内容 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba"…

【刷题】 二分查找进阶

送给大家一句话&#xff1a; 你向神求助是因为相信神&#xff0c;神没有回应你是因为神相信你 ε≡٩(๑>₃<)۶ &#xfeff;ε≡٩(๑>₃<)۶ &#xfeff;ε≡٩(๑>₃<)۶ 一心向学 二分查找进阶 1 前言Leetcode 852. 山脉数组的峰顶索引题目描述算法思…

【C++提高】常用容器

常用容器 引言&#xff1a;迭代器的使用一、vector容器1. vector基本概念2. vector的迭代器3. vector构造函数4. vector赋值操作5. vector容量和大小6. vector插入和删除7. vector数据存取8. vector互换容器9. vector预留空间 二、deque容器1. deque容器的基本概念2. deque容器…

终端的颜值担当-WindTerm

一、序言 今天就不给各位大佬聊技术了&#xff0c;给大佬们分享一款高颜值的终端工具——WindTerm。 二、什么是 WindTerm WindTerm&#xff08;也称为 Wind Term&#xff09;是一款终端仿真器&#xff0c;可用于在 Windows/MacOS/Linux 操作系统上模拟类 Unix 环境的命令行…