如何动手用js自己写一个分页?

news2024/9/29 15:27:55

实现效果

 实现代码

function generateTableHead() {
  const tableHead = document.getElementById('table-head');
  tableHead.innerHTML = '';

  // 添加复选框列的表头
  const checkboxHead = document.createElement('th');
  const checkbox = document.createElement('input');
  checkbox.type = 'checkbox';
  checkbox.addEventListener('click', function() {
    const checkboxes = document.querySelectorAll('#table input[type="checkbox"]');
    checkboxes.forEach(cb => {
      cb.checked = checkbox.checked;
    });
  });
  checkboxHead.appendChild(checkbox);
  tableHead.appendChild(checkboxHead);

  // 添加序号列的表头
  const indexHead = document.createElement('th');
  indexHead.textContent = '序号';
  tableHead.appendChild(indexHead);

  // 添加其他数据列的表头
  Object.keys(rowsToShow[0]).forEach(key => {
    const th = document.createElement('th');
    th.textContent = key;
	th.style.width = 'auto';
    tableHead.appendChild(th);
  });

  // 添加处理按钮列的表头
  const buttonHead = document.createElement('th');
  buttonHead.textContent = '操作';
  buttonHead.style.textAlign = 'center'; // 设置浮动
  tableHead.appendChild(buttonHead);
}

// 生成表格行
function generateTableRows(buttonData,btncallback) {
  const tableBody = document.getElementById('table-body');
  tableBody.innerHTML = '';

  rowsToShow.forEach((rowData, index) => {
    const row = document.createElement('tr');

    // 添加复选框列
    const checkboxCell = document.createElement('td');
    const checkbox = document.createElement('input');
    checkbox.type = 'checkbox';
    checkboxCell.appendChild(checkbox);
    row.appendChild(checkboxCell);

    // 添加序号列
    const indexCell = document.createElement('td');
    indexCell.textContent = index + 1;
    row.appendChild(indexCell);

    // 添加其他数据列
    Object.values(rowData).forEach(value => {
      const td = document.createElement('td');
	  td.style.width = 'auto';
      td.textContent = value;
      row.appendChild(td);
    });

    // 添加处理按钮列
    const buttonCell = document.createElement('td');
    // buttonCell.style.float = 'right'; // 设置浮动
	 buttonCell.style.textAlign = 'center'; // 设置浮动
	buttonCell.style.width = 'auto'; // 设置浮动
    buttonData.forEach(button => {
      const buttonElement = document.createElement('div');
	  console.log(button.icon)
	  buttonElement.innerHTML = `
	    <div class="button-content" >
	      <span class="icon">${button.icon}</span>
	      <span class="label">${button.label}</span>
	    </div>
	  `;

     
	  buttonElement.ev=button.ev;
	  button.class.forEach(cls => {
		  buttonElement.classList.add(cls);
	  });
	  buttonElement.style = button.style; // 设置按钮样式
      buttonElement.addEventListener('click', function() {
		  if (typeof btncallback === 'function') {
		     btncallback(buttonElement.ev,rowData);
		   }
      });
      buttonCell.appendChild(buttonElement);
    });

    row.appendChild(buttonCell);
    tableBody.appendChild(row);
  });
}

// 处理行数据
function handleRowData(rowData) {
  // 在这里执行处理行数据的操作
  console.log(rowData);
}

// 获取选中数据
function getSelectedData() {
  const selectedData = [];
  const checkboxes = document.querySelectorAll('input[type="checkbox"]');
  checkboxes.forEach((cb, index) => {
    if (cb.checked) {
      selectedData.push(rowsToShow[index]);
    }
  });
  return selectedData;
}
	let activepage=1;
    let selectCurent=0;
    // 生成分页
   function generatePagination(page, totalPages, totalRows,callback) {
     const pagination = document.getElementById('pagination');
     pagination.innerHTML = '';
     const prevButton = document.createElement('a');
	 prevButton.classList.add('wpagebtn');
	 prevButton.classList.add('wpagebtn-hover');
     prevButton.innerHTML = 'pre';
     prevButton.addEventListener('click', () => {
       if (page > 1) {
         page--;
		  if (typeof callback === 'function') {
		     const result = {page:page,pageSize:pageSize};
		     callback(result);
		   }
       }
     });
     pagination.appendChild(prevButton);
   
     const maxVisiblePages = 5; // 最大可见的页数
     const middlePage = Math.ceil(maxVisiblePages / 2);
     const startPage = Math.max(1, page - middlePage + 1);
     const endPage = Math.min(startPage + maxVisiblePages - 1, totalPages);
   
     if (startPage > 1) {
       const firstPageButton = document.createElement('a');
       firstPageButton.classList.add('wpagebtn');
       firstPageButton.innerHTML = '1';
       firstPageButton.addEventListener('click', () => {
         if (page !== 1) {
           page = 1;
           if (typeof callback === 'function') {
              const result = {page:page,pageSize:pageSize};
              callback(result);
            }
         }
       });
       pagination.appendChild(firstPageButton);
       if (startPage > 2) {
         const ellipsisButton = document.createElement('a');
         ellipsisButton.classList.add('wpagebtn');
         ellipsisButton.innerHTML = '...';
         pagination.appendChild(ellipsisButton);
       }
     }
   
     for (let i = startPage; i <= endPage; i++) {
       const pageButton = document.createElement('a');
       pageButton.classList.add('wpagebtn');
       pageButton.innerHTML = i;
       if (i === page) {
		   activepage=page;
         pageButton.classList.add('wpagebtn-active');
       }
       pageButton.addEventListener('click', () => {
         if (i !== page) {
           page = i;
           if (typeof callback === 'function') {
              const result = {page:page,pageSize:pageSize};
              callback(result);
            }
         }
       });
       pagination.appendChild(pageButton);
     }
   
     if (endPage < totalPages) {
       if (endPage < totalPages - 1) {
         const ellipsisButton = document.createElement('a');
         ellipsisButton.classList.add('wpagebtn');
         ellipsisButton.innerHTML = '...';
         pagination.appendChild(ellipsisButton);
       }
   
       const lastPageButton = document.createElement('a');
       lastPageButton.classList.add('wpagebtn');
       lastPageButton.innerHTML = totalPages;
       lastPageButton.addEventListener('click', () => {
         if (page !== totalPages) {
           page = totalPages;
           if (typeof callback === 'function') {
              const result = {page:page,pageSize:pageSize};
              callback(result);
            }
         }
       });
       pagination.appendChild(lastPageButton);
     }
     const nextButton = document.createElement('a');
     nextButton.classList.add('wpagebtn');
	 nextButton.classList.add('wpagebtn-hover');
     nextButton.innerHTML = 'next';
     nextButton.addEventListener('click', () => {
       if (page < totalPages) {
         page++;
         if (typeof callback === 'function') {
            const result = {page:page,pageSize:pageSize};
            callback(result);
          }
       }
     });
     pagination.appendChild(nextButton);
   
     const totalRowsElement = document.createElement('span');
	 totalRowsElement.classList.add('wpagebtn');
     totalRowsElement.innerHTML = `总条数:${totalRows}`;
     pagination.appendChild(totalRowsElement);
	  
	 const selectContainer = document.createElement('select');
	    selectContainer.classList.add('wpage-select');
	 
	  selectContainer.addEventListener('change', () => {
	    const value = parseInt(selectContainer.value);
	    page = 1; // 将当前页码重置为 1
	    activepage = 1; // 重置当前选中的页面
		selectCurent=value;
		pageSize=selectCurent;
	    if (typeof callback === 'function') {
	       const result = {page:page,pageSize:pageSize};
	       callback(result);
	     }
	  });
	  const options = [10, 20, 50, 100,200];
	  for (let i = 0; i < options.length; i++) {
	    const option = document.createElement('option');
	    option.value = options[i];
	    option.text = `${options[i]} 条/页`;
		if(selectCurent==options[i]){
			option.selected=true;
		}
	    selectContainer.appendChild(option);
	  }
	  
	  pagination.appendChild(selectContainer);
	  
	   const spango = document.createElement('span');
	   spango.classList.add('wpagebtn');
	   spango.innerText="前往";
	   pagination.appendChild(spango);
	   
	  const inputgo = document.createElement('input');
	     inputgo.classList.add('wpagetinput');
	     inputgo.value= activepage;
	     inputgo.addEventListener('input', ()=> {
	  	  const value = parseInt(inputgo.value);
	  	   if (value >= 1 && value <= totalPages) {
	  	     activepage = value; // 更新当前选中的页面
	  	     if (typeof callback === 'function') {
	  	        const result = {page:value,pageSize:pageSize};
	  	        callback(result);
	  	      }
	  		}
	     });
	   pagination.appendChild(inputgo);
	   
	   const spangoend = document.createElement('span');
	   spangoend.classList.add('wpagebtn');
	    spangoend.innerText="页";
	   pagination.appendChild(spangoend);
   }

 

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

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

相关文章

项目部署

#修改表的编码 alter table t_course convert to character set utf8 show create table t_course启动docker&#xff1a; service docker startdocker创建redis设置密码&#xff1a; docker pull redis docker run --name my-redis -p 6379:6379 -e REDIS_PASSWORD<pass…

【大数据趋势】7月2日 汇率,美澳,恒指期货的大数据趋势概率分析。

数据源头之一 : 汇率变化 从程序模拟趋势来看&#xff0c;如果没有干预&#xff0c;极大概率要试探顶部7.375的位置。【位置1】从长期趋势来看&#xff0c;在一个上升通道中长期震荡上行&#xff0c;所以正常应该走2.2的路径【趋势2.2】 因为这轮上涨的动能很大&#xff0c;所…

join on 后面的and 与where 的区别及用法

--- 先把数据导入数据库 CREATE TABLE test_join_where_a ( aid int(0) NOT NULL, aname varchar(255) , atimedate datetime(0) , ascore varchar(255) ); INSERT INTO test_join_where_a(aid, aname, atimedate, ascore) VALUES (1, 张三, 2023-05-03 01:13:30, 8…

环境变量的配置

在我上一篇文章中有写到&#xff0c;在编译和运行Hello World这个文档的时候要使用java.c和java这俩个工具&#xff0c;但是我们却没有转换到这俩个工具所在的磁盘位置&#xff0c;而是直接调用了&#xff0c;那么是怎么实现这一功能的嘞&#xff0c;就有下面的理解 首先wine打…

Linux--给指令起别名:alias

示例&#xff1a;给ls-al起了个别名叫kk​ 注意&#xff1a;起别名只在本次登录有效。

Python爬虫-某政务网站文档爬取,并将正文内容保存在word

前言 本文是该专栏的第1篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cDovL3d3dy5oZWJlaS5nb3YuY24vc2VhcmNoL3BjUmVuZGVyP3BhZ2VJZD1iOTdhMzg4MzNmNzM0M2NlYmMzMWRlYzQ0NTQ0ZjY4NA== 需求:以某政务网网站为例,采集其正文内容,并将其正文内容以docx格式保…

借助APlayer、MetingJS实现 网页音乐播放器

借助APlayer、MetingJS实现 1、src/publi/index.html引入 <script src"https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js"></script> <script src"https://cdn.jsdelivr.net/npm/meting2.0.1/dist/Meting.min.js"></scri…

离线安装ffmpeg源码包【详细教程】

今天分享一下ffmpeg源码包的安装过程&#xff0c;针对在没有网络环境下&#xff0c;且不能直接使用yum如何成功安装ffmpeg源码包。博主本人通过正式服务器测试&#xff0c;记录整个安装过程。值得大家收藏 同时&#xff0c;我会分享一下如何使用ffmpeg对H.264格式视频(MP4)进行…

echarts数据可视化模板相互影响

问题 echarts数据可视化模板相互影响 详细问题 echarts数据可视化模板相互影响,笔者使用由CSSJavaScriptHTML实现的echarts数据可视化模板&#xff0c;对于其中的子图(图A&#xff0c;位于boxA.js下与图B位于boxB.js下)进行数据下钻&#xff0c;更改option配置后&#xff0c…

苹果正在研发具备智能家居显示功能的外接显示器,具备低功耗模式

据彭博社记者 Mark Gurman 在他最新一期的 Power On 时事通讯中报道&#xff0c;苹果公司正致力于研发一款新的 Mac 外接显示器&#xff0c;具备智能家居设备显示器的低功耗模式功能。 根据了解&#xff0c;这款显示器将集成iOS设备芯片&#xff0c;与Studio Display不同的是&a…

最短路径相关算法

文章目录 图论中的图属性最短路径算法- Dijkstra算法1. 算法介绍2. 适用场景3. 场景举例 - Bellman-Ford算法1. 算法介绍2. 适用场景3. 场景举例 - Floyd-Warshall算法1. 算法介绍2. 适用场景3. 场景举例 具体实现方案- JGraphT 小结 图论中的图属性 图论中&#xff0c;图的属…

SpringMVC (三) RestFul和控制器

学习回顾&#xff1a;SpringMVC &#xff08;一&#xff09; 什么是SpringMVC 现在我们来看看里面的控制器和路径请求的具体内容吧&#xff01; 一、控制器Controller 控制器复杂提供访问应用程序的行为&#xff0c;通常通过接口定义或注解定义两种方法实现。控制器负责解析用户…

如何在Centos7下安装Nginx

一、Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 &#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;公开版本1.19.6…

Self-attention Transformer

参考资料&#xff1a; 《机器学习》李宏毅 1 Self-attention 当模型输入为长度不定的向量序列时&#xff08;如一段文字、一段语音、图模型&#xff09;&#xff0c;要求模型输出为等长的向量序列&#xff08;序列标注&#xff09;时&#xff0c;可以使用 Self-attention S…

文件的概念 + 文件的相对/绝对路径 + 文件IO字符流 / 字节流的读写操作 (java)

文章目录 前言一、文件是什么1.文件的概念2.文件路径1.绝对路径2.相对路径 二、针对文件的IO1.File类2.对文件内容的读写操作1.针对文本文件—— 字符流输入流 Reader类输出流 Writer类 2.针对二进制文件—— 字节流输入流 InputStream类输出流 OutputStream类 总结 前言 本人…

《Reinforcement Learning: An Introduction》第7章笔记

Chapter 7 n-step Bootstrapping 本章的n-step TD方法是前两章的Monte Carlo 方法和one-step TD方法的推广。它使自举法在多个时间步内进行&#xff0c;解决了前两章中的更新时间步不灵活的问题。 7.1 n-step TD Prediction 在用策略 π \pi π下生成的采样回合序列来估计 v…

UE5 MetaHuman SDK插件的使用【一、编辑器创建音波与蓝图创建获取音波,音波与嘴唇的同步】

目录 打开插件 创建音频 编辑器这直接创建音频&#xff1a; 蓝图中创建和获取音频&#xff1a; 唇语&#xff1a; 声音与嘴唇同步&#xff1a; 方法一【效果不是很好】&#xff1a; 方法二【效果很好&#xff0c;但有一段时间延迟在处理】&#xff1a; 逻辑&#xff1…

Spring Boot 中的微服务架构:原理和使用

Spring Boot 中的微服务架构&#xff1a;原理和使用 什么是微服务架构&#xff1f; 微服务架构是一种软件架构模式&#xff0c;它将一个应用程序分解成一组小的、松散耦合的服务。每个服务都有独立的进程和数据存储&#xff0c;可以独立地开发、部署、测试和扩展。这种架构模…

最新AI创作系统ChatGPT网站源码+新增GPT联网功能+支持GPT4+支持ai绘画+实时语音识别输入

最新AI创作系统ChatGPT网站源码新增GPT联网功能支持GPT4支持ai绘画实时语音识别输入 一、AI创作系统二、系统介绍三、系统程序下载四、安装教程五、其他主要功能展示六、更新日志 一、AI创作系统 提问&#xff1a;程序已经支持GPT3.5、GPT4.0接口、支持新建会话&#xff0c;上…

常见面试题之ThreadLocal的理解

1. ThreadLocal概述 ThreadLocal是多线程中对于解决线程安全的一个操作类&#xff0c;它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal同时实现了线程内的资源共享 案例&#xff1a;使用JDBC操作数据库时&#xff0c;会将每一个线程的…