原生js+ajax分页组件

下面我详细讲解一下如何实现“原生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日

相关文章

  • Yii2创建表单(ActiveForm)方法详解

    我们来详细讲解一下如何使用Yii2创建表单(ActiveForm)方法。 1、ActiveForm的基本使用 ActiveForm是Yii2框架中非常常用的一个类,它可以用于生成带有表单验证功能的HTML表单。要使用ActiveForm,需要使用Yii2的表单模型(yii\base\Model)来作为表单的模型,根据模型来生成表单。 1.1 创建表单和表单字…

    JavaScript 2023年6月11日
    00
  • js关闭当前页面(窗口)的几种方式总结

    关于“js关闭当前页面(窗口)的几种方式总结”,我为大家总结了以下几种方式: 方式一:使用window.close() 在JS中使用window.close()方法可以关闭当前页面,示例代码如下: <button onclick="window.close()">关闭当前页面</button> 需要注意的是,该方法…

    JavaScript 2023年6月11日
    00
  • Vue项目全局配置微信分享思路详解

    “Vue项目全局配置微信分享思路详解”是一篇关于Vue项目中如何全局配置微信分享的攻略。下面我将详细讲解该攻略的完整思路和步骤。 标题 首先,我们需要在页面中引入微信的JS-SDK,获取微信的appid、noncestr、timestamp、signature等参数。在Vue项目中,通常使用axios进行网络请求,获取JS-SDK配置参数的代码如下所示: i…

    JavaScript 2023年6月11日
    00
  • 你不知道的5个JavaScript中JSON的秘密功能分享

    你不知道的5个JavaScript中JSON的秘密功能分享 1. JSON 对象的 stringify() 方法 定义 我们知道,JavaScript 中的 JSON 对象有一个 stringify() 方法,它的作用是将一个 JavaScript 对象转换成对应的 JSON 字符串。 用法 const obj = { name: ‘Lucas’, age:…

    JavaScript 2023年6月10日
    00
  • JavaScript中强大的操作符使用详解

    JavaScript中强大的操作符使用详解 JavaScript中的操作符可用于进行数学或布尔运算。其中一些操作符非常强大且使用频率也很高。在本文中,我将详细介绍这些操作符及其用法。 算术操作符 算术操作符用于数学运算。 加号操作符(+) 加号操作符可用于执行数学加法或字符拼接。对于两个数字相加的情况,其用法如下: let a = 5, b = 6; let…

    JavaScript 2023年5月17日
    00
  • javascript的防抖节流函数解析

    下面就来详细讲解“JavaScript的防抖节流函数解析”的完整攻略。 一、防抖函数 1.1 什么是防抖函数? 防抖函数是一种常用的JS功能,用于延迟搜索框或输入框等交互操作的调用时间,以提高用户的体验和性能。防抖函数会等待用户停止操作,并只在停止时才执行一次操作。 1.2 防抖函数的实现 下面是一个基本的防抖函数示例代码: function debounc…

    JavaScript 2023年6月11日
    00
  • 如何在JavaScript中创建具有多个空格的字符串?

    要在JavaScript中创建具有多个空格的字符串,可以使用多种方法,以下是几个示例说明: 1. 使用空格符 可以直接在字符串中使用空格符(’ ‘)来添加空格。需要注意的是,字符串要用双引号或单引号引起来,避免其他字符干扰,示例代码如下: let str = "Hello World"; // 注意这里使用了四个空格符 console.l…

    JavaScript 2023年5月28日
    00
  • JS之小练习代码

    下面我会详细讲解一下从头到尾如何完成“JS之小练习代码”的完整攻略,包括准备工作、代码实现以及注意事项等。 准备工作 在开始写代码之前,我们需要进行一些准备工作。 在电脑上安装一个文本编辑器,比如VS Code。 创建一个新的HTML文件,在文件中引入JS代码。 在创建之前,我们还需要确定需要实现的小练习。 实现过程 以下是一个实现小练习代码的示例: 1. …

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