封装个js分页插件

news2024/12/25 13:49:39

// 分页插件类
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;
  }
}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

easyx库的学习(文字绘制)

前言 昨天刚刚写完了基本图形的制作&#xff0c;今天直接可以来看看&#xff0c;在easyx中使用文字 直接看代码吧 文字绘制 void drawTest() {printf("hello,EasyX");//指的是在控制台打印//设置字体大小&#xff0c;样式settextstyle(30, 0, "微软雅黑&quo…

二维码门楼牌管理应用平台建设:核实与审核的关键作用

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、核实与审核在二维码门楼牌管理中的应用三、核实与审核的重要性四、优化建议 前言 随着信息技术的快速发展&#xff0c;二维码门楼牌管理应用平台在社区管理中发挥着越来越重要的作用。本文将深入探讨该平台建设过程中…

数据结构––kmp算法(串)

kmp算法作为串的一个重要内容&#xff0c;必然有一定的难度&#xff0c;而在看到各类教辅书里的概念与解释后&#xff0c;其晦涩难懂的内容直接劝退一部分人&#xff0c;现在&#xff0c;让我们来看看吧 KMP解决的问题类型 KMP算法的作用就是在一个已知的字符串中查找子串的位…

一次Redis访问超时的“捉虫”之旅

01 引言 作为后端开发人员&#xff0c;对Redis肯定不陌生&#xff0c;它是一款基于内存的数据库&#xff0c;读写速度非常快。在爱奇艺海外后端的项目中&#xff0c;我们也广泛使用Redis&#xff0c;主要用于缓存、消息队列和分布式锁等场景。最近在对一个老项目使用的docker镜…

HTML、CSS常用的vscode插件 +Css reset 和Normalize.css

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍HTML、CSS常用的vscode插件&#x1f34e;1 HTML 标签同步重命名 – Auto Re…

ardunio中自定义的库文件

1、Arduino的扩展库都是放在 libraries目录下的。完整路径为&#xff1a;C:\Users\41861\AppData\Local\Arduino15\libraries 所以我们需要在这个目录下创建一个文件夹&#xff0c;比如上面的例子是esp32上led灯控制程序&#xff0c;于是我创建了 m_led文件夹&#xff08;前面加…

音视频封装格式解析(1)——H264格式简析,I/P/B帧是什么?H264压缩原理

文章目录 1. H264编码参数2. H264编码原理2.1 压缩原理2.2 编码结构解析 3. NALU结构4. H264 annexb模式5. 补充说明5.1 I帧5.2 P帧5.3 B帧 1. H264编码参数 视频质量和⽹络带宽占⽤是相⽭盾的。通常情况下&#xff0c;视频流占⽤的带宽越⾼则视频质量也越⾼&#xff0c;需要的…

zig v0.12.0 发布 — x-cmd 提供 zig 快捷安装方法和 x zig 模块

文章目录 简介功能特点v0.12.0 新特性[重新设计 Autodoc 的工作原理](https://ziglang.org/download/0.12.0/release-notes.html#Redesign-How-Autodoc-Works)语法变更各类标准库变更构建系统变更 常见用法**使用案例**:竞品和相关项目进一步阅读 简介 Zig 是一种通用编程语言…

OpenCV基本图像处理操作(九)——特征匹配

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法&#xff0c;经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括&#xff1a; 特征提取&#xff…

VOC2012数据集免费获取

你是否遇到过如下情况&#xff1a; 使用官方网站下载数据集&#xff0c;emmm这效率 我放到网盘中了&#xff0c;有需要的自取 https://pan.quark.cn/s/f8b457086b6c

1.为什么选择Vue框架

参考&#xff1a;百战程序员 为什么选择Vue框架 Vue是什么&#xff1f; 渐进式 JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以…

开源贡献代码之​探索一下CPython

探索一下Cython 本篇文章将会围绕最近给Apache提的一个feature为背景&#xff0c;展开讲讲CPython遇到的问题&#xff0c;以及尝试自己从0写一个库出来&#xff0c;代码也已经放星球了&#xff0c;感兴趣的同学可以去下载学习。 0.背景 最近在给apache arrow提的一个feature因为…

Unity UGUI透明区域点击无效

是这样的&#xff0c;我有一张图&#xff0c;客户给的是1920*1080&#xff0c;但只有中间部分是按钮&#xff0c;是有效像素。为了让空白区域点击无效。需要设置如下 并且加上下面这句 this.GetComponent<Image>().alphaHitTestMinimumThreshold 0.1f;

设计模式学习笔记 - 开源实战三(中):剖析Google Guava中用到的设计模式

概述 上篇文章&#xff0c;我通过 Google Guava 这样一个优秀的开源类库&#xff0c;讲解了如何在业务开发中&#xff0c;发现跟业务无关、可以复用的通用功能模块&#xff0c;并将它们抽离出来&#xff0c;设计成独立的类库、框架或功能组件。 本章再来学习下&#xff0c;Go…

Vue3——组件基础

组件基础 1. 组件定义与使用 1.1 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>组件基础&l…

力扣-LCP 02.分式化简

题解&#xff1a; class Solution:def fraction(self, cont: List[int]) -> List[int]:# 初始化分子和分母为 0 和 1n, m 0, 1# 从最后一个元素开始遍历 cont 列表for a in cont[::-1]:# 更新分子和分母&#xff0c;分别为 m 和 (m * a n)n, m m, (m * a n)# 返回最终的…

程序员如何应对久坐带来的不良影响

久坐是程序员工作中常见的问题&#xff0c;它可能对身体健康产生多种负面影响。为了应对这些影响&#xff0c;程序员可以采取以下措施&#xff1a; 定时休息&#xff1a;每隔45分钟至1小时&#xff0c;起身活动5-10分钟。这可以帮助缓解长时间坐姿带来的身体压力&#xff0c;促…

YOLOv9改进策略 | 添加注意力篇 | 挤压和激励单元SENetV2助力YOLOv9细节涨点(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何一个模型相结合的模块(可以看作是一种通道型的注意力机制但是相对于SENetV1来说…

Aws Nat Gateway

要点 NAT网关要能访问外网&#xff0c;所以需要部署在有互联网网关的Public子网中。 关键&#xff1a; NAT网关创建是选择子网&#xff0c;一定要选择公有子网&#xff08;有互联网网关子网&#xff09; 特别注意&#xff1a; 新建nat网关的时候&#xff0c;选择的子网一定…

Ubuntu无法安装向日癸15.2.0.63062_amd64.deb最新版

Ubuntu安装向日葵远程控制 安装包下载 安装方式 方式一&#xff1a;运行安装包安装 方式二&#xff1a;终端命令安装 通过以下教程可以快速的安装向日葵远程控制&#xff0c;本教程适用于Ubuntu18.04/20.04/22.04 安装包下载 进入向日葵远程控制下载官网下载向日葵远程控制Lin…