原生js+ajax分页组件

yizhihongxing

下面我详细讲解一下如何实现“原生js+ajax分页组件”。

前置知识

在实现分页组件之前,需要对以下几个知识点有一定的了解。

  1. 原生JS的DOM操作
  2. Ajax异步请求及响应
  3. 分页算法

分页算法

分页算法是分页组件实现的核心。下面介绍两种常见的分页算法。

基本分页算法

基本分页算法的实现非常简单,直接根据当前页码和每页显示数量计算出起始记录的位置和结束位置,再将数据进行截取即可。其计算公式如下:

$start = ($page - 1) * $pagesize;
$end = $start + $pagesize - 1;

其中,$page表示当前页码,$pagesize表示每页显示数量。

带省略号的分页算法

当分页数过多时,会出现页码过多、页面宽度不够的问题。此时,可以采用省略号来展示更多的页码。具体实现方式为:当页码数量超过预设值时,将部分页码用省略号代替,让用户点击省略号展开更多的页码。下面是页面展示效果:

1 2 3 ... 9 10 11 ... 19 20

实现这种分页算法需要在分页组件中添加展开省略号、合并省略号的功能。

分页组件实现步骤

接下来,我们开始实现“原生js+ajax分页组件”。

  1. 定义HTML结构

分页组件的基本HTML结构如下:

<ul class="pagination"></ul>
  1. 定义CSS样式

我们可以使用Bootstrap样式库中的分页样式,也可以自己编写样式。下面是一个基本的分页样式:

.pagination {
    list-style: none;
    display: inline-block;
    padding-left: 0;
    border-radius: 4px;
}

.pagination li {
    display: inline;
}

.pagination li a {
    color: #666;
    background-color: #fff;
    border: 1px solid #ddd;
    padding: 6px 12px;
}

.pagination li:first-child a {
    border-top-left-radius: 4px;
    border-bottom-left-radius: 4px;
}

.pagination li:last-child a {
    border-top-right-radius: 4px;
    border-bottom-right-radius: 4px;
}

.pagination li a:hover,
.pagination li.active a {
    color: #fff;
    background-color: #337ab7;
    border-color: #337ab7;
}
  1. 实现分页逻辑

在实现分页逻辑之前,我们需要定义以下几个变量:

var currentPage = 1; // 当前页码
var totalPage = 1; // 总页码数
var pageSize = 10; // 每页显示数量
var maxShowPage = 5; // 最多展示的页码数,超过这个数会出现省略号
var ajaxUrl = '/data.json'; // 数据请求地址

接着,在页面加载完成时,我们需要向后台请求数据并进行页面渲染。这可以通过以下步骤来完成:

  1. 发送Ajax异步请求,获取后台返回的数据;
  2. 计算页码数量、总记录数等分页数据;
  3. 根据分页数据生成相应的分页HTML代码,并将其插入到页面中。

下面是实现分页逻辑的示例代码:

function loadData(url, callback) {
    // 发送Ajax请求,获取后台返回的数据
    // 代码省略...
}

function renderPagination(currentPage, totalPage) {
    var paginationHtml = '';
    var startPage, endPage;

    // 计算展示的页码范围
    if (totalPage <= maxShowPage) {
        startPage = 1;
        endPage = totalPage;
    } else {
        // 计算左侧页码范围
        startPage = currentPage - Math.floor(maxShowPage / 2);
        endPage = startPage + maxShowPage - 1;

        // 如果左侧范围不足,则修改右侧范围
        if (startPage < 1) {
            endPage = currentPage + (maxShowPage - 1);
            startPage = endPage - maxShowPage + 1;
        }

        // 如果右侧范围超出总页码数,则修改左侧范围
        if (endPage > totalPage) {
            endPage = totalPage;
            startPage = endPage - maxShowPage + 1;
        }
    }

    // 生成HTML代码
    paginationHtml += '<li><a href="#" data-page="' + 1 + '">首页</a></li>';
    paginationHtml += '<li><a href="#" data-page="' + (currentPage - 1) + '">上一页</a></li>';
    for (var i = startPage; i <= endPage; i++) {
        var activeClass = i === currentPage ? 'active' : '';
        paginationHtml += '<li class="' + activeClass + '"><a href="#" data-page="' + i + '">' + i + '</a></li>';
    }
    paginationHtml += '<li><a href="#" data-page="' + (currentPage + 1) + '">下一页</a></li>';
    paginationHtml += '<li><a href="#" data-page="' + totalPage + '">末页</a></li>';

    return paginationHtml;
}

function initPagination(currentPage, totalPage) {
    var paginationHtml = renderPagination(currentPage, totalPage);
    var paginationWrapper = document.querySelector('.pagination');

    // 清空原有的分页按钮
    paginationWrapper.innerHTML = '';

    // 将分页按钮插入到页面中
    var tempDiv = document.createElement('div');
    tempDiv.innerHTML = paginationHtml;
    paginationWrapper.appendChild(tempDiv.querySelector('ul'));

    // 为分页按钮绑定点击事件
    paginationWrapper.addEventListener('click', function(e) {
        var pageInput = e.target.dataset.page;
        if (pageInput) {
            e.preventDefault();
            if (pageInput === '...') return; // 省略号按钮不可点击

            var page = parseInt(pageInput);
            if (page > 0 && page <= totalPage && page !== currentPage) {
                currentPage = page;
                loadData(ajaxUrl, function(data) {
                    // 根据新页码重新渲染分页按钮
                    totalPage = Math.ceil(data.length / pageSize);
                    paginationHtml = renderPagination(currentPage, totalPage);

                    // 将分页按钮插入到页面中
                    tempDiv.innerHTML = paginationHtml;
                    paginationWrapper.innerHTML = '';
                    paginationWrapper.appendChild(tempDiv.querySelector('ul'));

                    // 更新数据内容
                    var start = (currentPage - 1) * pageSize;
                    var end = start + pageSize;
                    var dataHtml = '';
                    for (var i = start; i < end && i < data.length; i++) {
                        dataHtml += '<li>' + data[i] + '</li>';
                    }
                    document.querySelector('.data').innerHTML = '<ul>' + dataHtml + '</ul>';
                });
            }
        }
    });
}

loadData(ajaxUrl, function(data) {
    totalPage = Math.ceil(data.length / pageSize); // 计算总页码数
    initPagination(currentPage, totalPage); // 初始化分页组件

    // 渲染初始数据内容
    var start = (currentPage - 1) * pageSize;
    var end = start + pageSize;
    var dataHtml = '';
    for (var i = start; i < end && i < data.length; i++) {
        dataHtml += '<li>' + data[i] + '</li>';
    }
    document.querySelector('.data').innerHTML = '<ul>' + dataHtml + '</ul>';
});

示例说明

下面给出两个分页组件示例,供参考。

示例一

以下是一个简单的分页组件示例,代码如下:

<div class="data"></div>
<ul class="pagination"></ul>

<script>
var currentPage = 1;
var totalPage = 1;
var pageSize = 10;
var maxShowPage = 5;
var ajaxUrl = '/data.json';

function loadData(url, callback) {
    // 发送Ajax请求,获取后台返回的数据
    // 代码省略...
}

function renderPagination(currentPage, totalPage) {
    // 代码省略...
}

function initPagination(currentPage, totalPage) {
    // 代码省略...
}

loadData(ajaxUrl, function(data) {
    totalPage = Math.ceil(data.length / pageSize); // 计算总页码数
    initPagination(currentPage, totalPage); // 初始化分页组件

    // 渲染初始数据内容
    var start = (currentPage - 1) * pageSize;
    var end = start + pageSize;
    var dataHtml = '';
    for (var i = start; i < end && i < data.length; i++) {
        dataHtml += '<li>' + data[i] + '</li>';
    }
    document.querySelector('.data').innerHTML = '<ul>' + dataHtml + '</ul>';
});
</script>

在实现分页组件之前,我们需要定义几个变量。currentPage表示当前显示的页码,totalPage表示总页码数,pageSize表示每页显示数量,maxShowPage表示最多展示的页码数,ajaxUrl表示数据请求地址。我们首先通过Ajax请求数据,并计算出总页码数,然后初始化分页组件,并渲染出初始数据内容。当用户点击分页按钮时,我们根据新的页码重新渲染分页组件,然后再重新加载数据并渲染内容。

示例二

以下是一个带省略号的分页组件示例,代码如下:

<div class="data"></div>
<ul class="pagination"></ul>

<script>
var currentPage = 1;
var totalPage = 1;
var pageSize = 10;
var maxShowPage = 5;
var ajaxUrl = '/data.json';

function loadData(url, callback) {
    // 发送Ajax请求,获取后台返回的数据
    // 代码省略...
}

function renderPagination(currentPage, totalPage) {
    // 代码省略...
}

function initPagination(currentPage, totalPage) {
    // 代码省略...
}

loadData(ajaxUrl, function(data) {
    totalPage = Math.ceil(data.length / pageSize); // 计算总页码数
    initPagination(currentPage, totalPage); // 初始化分页组件

    // 渲染初始数据内容
    var start = (currentPage - 1) * pageSize;
    var end = start + pageSize;
    var dataHtml = '';
    for (var i = start; i < end && i < data.length; i++) {
        dataHtml += '<li>' + data[i] + '</li>';
    }
    document.querySelector('.data').innerHTML = '<ul>' + dataHtml + '</ul>';
});
</script>

这个分页组件与前一个例子的基本实现相同,只是增加了省略号的功能。当页码数量超过预设值时,我们会用省略号代替部分页码。用户当点击省略号按钮时,我们会展开更多的页码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js+ajax分页组件 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS读取cookies信息(记录用户名)

    关于 “JS读取cookies信息(记录用户名)” 的攻略,以下是详细步骤: 1.设置cookie 在用户登陆成功后,我们可以将用户的信息(例如用户名)作为cookie存储到客户端浏览器,下次访问时即可从cookie中读取该信息,自动填充到登录表单。 以下是一个设置cookie的示例代码: // 设置cookie函数 function setCookie(n…

    JavaScript 2023年6月11日
    00
  • javascript 跨浏览器开发经验总结(五) js 事件

    JavaScript 跨浏览器开发经验总结(五)JS 事件 简介 JavaScript 事件是 Web 开发中最常见的技术之一。通过事件,Web 应用程序可以在文档中生成动态交互效果。但是,Web 浏览器之间的事件处理存在很多差异,因此需要跨浏览器开发经验。 本文将提供有关 JavaScript 事件的跨浏览器开发经验,以帮助您优化 Web 应用程序的性能并…

    JavaScript 2023年5月18日
    00
  • javascript Keycode对照表

    下面我来为你详细讲解“JavaScript KeyCode对照表”的完整攻略。 什么是KeyCode对照表? KeyCode 是一个用来表示按键代码的数字值。在Web开发中,我们可以利用KeyCode来检测用户按了哪个键。而 KeyCode对照表 是一个清单,包含了所有可检测的键的代码及其对应的常量值。在编写JavaScript事件处理程序时,遵循KeyCo…

    JavaScript 2023年5月20日
    00
  • 原生JS:Date对象全面解析

    原生JS:Date对象全面解析 什么是Date对象 Date 对象是 JavaScript 中的内置对象,用于处理日期和时间。可以使用 new 关键字实例化一个 Date 对象。 var now = new Date(); 上述代码会返回一个 Date 对象,表示当前的日期和时间。 Date对象的方法和属性 获取年份,月份和日期 Date 对象提供了获取其表…

    JavaScript 2023年5月27日
    00
  • JavaScript本地储存:localStorage、sessionStorage、cookie的使用

    JavaScript本地储存:localStorage、sessionStorage、cookie的使用 什么是本地储存? 在网站开发中,需要将一些数据临时储存起来。本地储存技术就是把数据储存在客户端浏览器中,这样就可以避免跨页面、跨域、跨浏览器的问题,提高网站的性能和用户体验。本地储存技术通常包括localStorage、sessionStorage和Co…

    JavaScript 2023年6月10日
    00
  • JavaScript中this的用法实例分析

    使用JavaScript中的this关键字可以引用当前对象,这在许多情况下是非常有用的。在本文中,我们将学习this的用法实例分析。 什么是this? this关键字是JavaScript中的一种关键字,它被用来引用当前对象。简单来说,this关键字是一个指向当前正在执行的代码所在的对象的指针。 在对象中,this指向该对象本身。在函数中,this指向其调用…

    JavaScript 2023年5月28日
    00
  • 分享5个JavaScript的写法小技巧

    下面我将为您详细讲解“分享5个JavaScript的写法小技巧”的完整攻略。 1. 使用解构赋值获取对象中的属性值 解构赋值是一个方便快捷的方式来获取对象中的属性值,可以让你避免手动访问和提取对象属性的繁琐操作。 示例: const obj = { name: "Tom", age: 18, gender: "male&quot…

    JavaScript 2023年5月17日
    00
  • AJAX打造博客无刷新搜索

    接下来我将详细讲解如何使用AJAX技术打造博客无刷新搜索功能的完整攻略。 一、什么是AJAX? AJAX是Asynchronous JavaScript and XML的缩写,即用JavaScript和XML异步交互的一种技术,它可以在网页上实现异步请求和数据交互,从而实现无需刷新页面就可以动态更新网页。 二、AJAX打造博客无刷新搜索的步骤 第一步:创建搜…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部