原生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日

相关文章

  • JS实现可直接显示网页代码运行效果的HTML代码预览功能实例

    要实现可直接显示网页代码运行效果的HTML代码预览功能实例,可以使用JavaScript和HTML结合的方式来进行开发。主要的步骤分为以下几个部分: HTML布局:在HTML文件中,需要定义一个用于显示代码的div容器,以及一个用于输入代码的textarea元素。 <div id="code-container"></d…

    JavaScript 2023年5月28日
    00
  • 解决vue中使用history.replaceState 更改url vue router 无法感知的问题

    在Vue Router中,要想改变URL但不重新加载页面,可以使用history.pushState()或history.replaceState()方法。但有时使用history.replaceState()方法更改URL后,Vue Router可能无法感知URL的改变,从而不会更新视图,这可能是由于缺少路由监视或未调用Vue Router API的原因。…

    JavaScript 2023年6月11日
    00
  • JS如何通过FileReader获取.txt文件内容

    获取.txt文件内容的完整攻略可以分为以下几个步骤: 获取input标签上传的文件对象。 利用JavaScript中的FileReader API读取文件内容。 将文件内容进行处理展示。 下面我们分别介绍每个步骤的具体实现。 第一步:获取上传的文件对象 在HTML中,我们可以通过input标签来实现文件上传功能。例如: <label for=&quot…

    JavaScript 2023年5月27日
    00
  • js局部刷新页面时间具体实现

    实现JS局部刷新页面的两种常见方式是使用JS内置的location.reload()方法和使用AJAX请求后台返回的数据来更新页面。 使用location.reload()方法刷新页面 location.reload()方法可以重新加载当前页面,如果传入参数true则会强制从服务器重新加载页面,但是这种方式会刷新整个页面,无法局部刷新。因此,我们可以通过在J…

    JavaScript 2023年5月27日
    00
  • 实现JavaScript高性能的数据存储

    当我们在实现JavaScript应用程序时,经常需要存储数据。但是不同的数据存储方式对应的性能也不同。为了实现JavaScript高性能的数据存储,我们需要采用一些优化技巧来提高数据存储的性能。下面就分享一下实现JavaScript高性能的数据存储的攻略: 1. 选择合适的数据结构 常见的JavaScript数据结构包括数组、对象、Map和Set等。不同的数…

    JavaScript 2023年5月28日
    00
  • javascript 系统文件夹文件操作及参数介绍

    下面是关于“javascript 系统文件夹文件操作及参数介绍”的完整攻略。 标题 JavaScript 系统文件夹文件操作 介绍 JavaScript 可以通过 Node.js 模块 fs 来操作系统文件夹和文件。其中,fs 模块提供了一系列的 API,让开发者能够以代码的方式对文件进行读写、更改、创建、删除等操作。 API 参数介绍 以下为几个常用的 A…

    JavaScript 2023年5月27日
    00
  • 使用UglifyJS合并/压缩JavaScript的方法

    当我们开发JavaScript应用程序时,经常需要将多个JavaScript模块进行合并,并对合并后的JavaScript代码进行压缩,以减小文件大小,提高加载速度。这个过程可以使用UglifyJS完成。以下是使用UglifyJS合并/压缩JavaScript的方法: 准备工作 在开始使用UglifyJS之前,我们需要先安装Node.js和npm包管理器。安…

    JavaScript 2023年5月27日
    00
  • onkeypress字符按键兼容所有浏览器使用介绍

    下面是关于“onkeypress字符按键兼容所有浏览器使用介绍”的完整攻略。 什么是 onkeypress 事件 onkeypress 事件在用户按下并松开任意字符键时触发。该事件只能在可编辑区域或文本框中触发。 如何确保 onkeypress 兼容所有浏览器 不同的浏览器实现 onkeypress 事件的方式有所不同,为了确保事件的兼容性,我们可以使用如下…

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