jquery+bootstrap4的前端简单分页实现协助

jquery+bootstrap4的前端怎么实现简单分页,目前单独写前后端分离的项目,前端不是很熟悉,使用了bootstrap的分页

img

<div class="pagination-container float-right" id="create_project_modal_pagination">
                            <nav aria-label="Page navigation example">
                                <ul class="pagination">
                                    <li class="page-item project_page_item" project_page_id="" project_page_idx = 'first'>
                                        <a class="page-link" aria-label="Previous">
                                            <span aria-hidden="true">&laquo;</span>
                                        </a>
                                    </li>
                                    <li class="page-item active project_page_item" project_page_id="1" project_page_idx = 'second'><a class="page-link">1</a></li>
                                    <li class="page-item project_page_item" project_page_id="2" project_page_idx = 'third'><a class="page-link">2</a></li>
                                    <li class="page-item project_page_item" project_page_id="3" project_page_idx = 'fourth'><a class="page-link">3</a></li>
                                    <li class="page-item project_page_item" project_page_id="" project_page_idx = 'fifth'>
                                        <a class="page-link" href="#" aria-label="Next">
                                            <span aria-hidden="true">&raquo;</span>
                                        </a>
                                    </li>
                                </ul>
                            </nav>
                        </div>

网上查发现没有特别适用的,按自己的逻辑(比如增加了project_page_id和project_page_idx ),发现逻辑很多并且写的能实现但很混乱。

分页已经在后端做好了,这是后端Django分页类Paginator目前返回的数据,现在需要做的事是:
1、点击页码或上一页、下一页时post请求参数携带page=?
2、点击页码时,页码能自然更换,选中的页码在>=3时或小于最大值-n时,选中的页码展示在中间,页码数字自然排列

    page_data = {
        'page_queryset': page_queryset,  # 当前page的数据列表
        'has_previous': has_previous,   # 如果有上一页 has_previous = true
        'has_next': has_next,   # 如果有下一页 has_next = true
        'current_page_num': current_page_num, # 当前页码
        'total_page': total_page, # 总页数
        'page_queryset_count': page_queryset_count, # 总数据数
        'prevous_page_num': prevous_page_num,   # 上一页码,已经判断过最小值和最大值
        'next_page_num': next_page_num, # 下一页码,已经判断过最小值和最大值
    }

可以通过以下步骤来实现,仅供参考,若有帮助,还望采纳,点击回答右侧采纳即可。


  1. 创建一个Vue组件来处理分页。

  2. 在Vue组件中定义一个数据属性currentPage,用于存储当前选中的页码。

  3. 在Vue组件中定义一个方法changePage,当用户点击页码或上一页、下一页时,该方法将发送post请求,参数为page=currentPage

  4. 在Vue组件中定义计算属性pages,该属性根据后端返回的分页数据计算出需要展示的页码数组。

  5. 在Vue组件中使用v-for指令循环展示页码,并使用v-bind:class指令设置选中样式。

  6. 在Vue组件的模板中添加上一页、下一页按钮,并使用v-bind:disabled指令设置禁用样式,以防止用户无限制地点击按钮。

以下是一个简单的示例代码,供参考:

<template>
  <div>
    <ul>
      <li>
        <button @click="changePage(currentPage - 1)" :disabled="currentPage === 1">上一页</button>
      </li>
      <li v-for="page in pages" :key="page">
        <button @click="changePage(page)" :class="{ active: page === currentPage }">{{ page }}</button>
      </li>
      <li>
        <button @click="changePage(currentPage + 1)" :disabled="currentPage === totalPages">下一页</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentPage: 1,
    };
  },
  computed: {
    pages() {
      const start = Math.max(this.currentPage - 2, 1);
      const end = Math.min(start + 4, this.totalPages);
      return Array.from({ length: end - start + 1 }, (_, i) => start + i);
    },
    totalPages() {
      return Math.ceil(this.totalItemCount / this.itemsPerPage);
    },
  },
  methods: {
    changePage(page) {
      if (page >= 1 && page <= this.totalPages) {
        this.currentPage = page;
        this.$emit('change', { page });
      }
    },
  },
  props: {
    totalItemCount: {
      type: Number,
      required: true,
    },
    itemsPerPage: {
      type: Number,
      required: true,
    },
  },
};
</script>

<style>
button {
  border: none;
  background-color: transparent;
  outline: none;
  cursor: pointer;
}
button:disabled {
  color: #ccc;
  cursor: not-allowed;
}
button.active {
  color: blue;
  font-weight: bold;
}
</style>

使用Bootstrap的Pagination组件可以很方便地实现分页功能。以下是使用jQuery和Bootstrap 4实现简单分页的步骤:

  1. 在HTML中添加Pagination组件,根据需要设置分页数量和当前页码。
<nav aria-label="Page navigation">
  <ul class="pagination">
    <li class="page-item">
      <a class="page-link" href="#" aria-label="Previous">
        <span aria-hidden="true">&laquo;</span>
        <span class="sr-only">Previous</span>
      </a>
    </li>
    <li class="page-item"><a class="page-link" href="#">1</a></li>
    <li class="page-item"><a class="page-link" href="#">2</a></li>
    <li class="page-item"><a class="page-link" href="#">3</a></li>
    <li class="page-item">
      <a class="page-link" href="#" aria-label="Next">
        <span aria-hidden="true">&raquo;</span>
        <span class="sr-only">Next</span>
      </a>
    </li>
  </ul>
</nav>
  1. 使用jQuery监听点击事件,根据点击的页码来获取相应的数据并渲染到页面上。
$(document).ready(function() {
  // 获取第一页的数据并渲染到页面上
  $.get('/api/data', function(data) {
    renderData(data);
  });

  // 监听点击事件,根据点击的页码获取相应的数据并渲染到页面上
  $('.pagination').on('click', '.page-link', function(e) {
    e.preventDefault();
    var page = $(this).text();
    $.get('/api/data?page=' + page, function(data) {
      renderData(data);
    });
  });

  // 渲染数据到页面上
  function renderData(data) {
    // 根据数据渲染到页面上的逻辑代码
  }
});

在上面的代码中,我们使用jQuery的$.get方法来获取数据,然后调用renderData函数将数据渲染到页面上。在点击事件中,我们获取被点击的页码,然后通过$.get方法获取相应的数据,并再次调用renderData函数将数据渲染到页面上。

参考gpt:
结合自己分析给你如下建议:
Bootstrap4分页组件的使用方法 这篇教程介绍了如何用Bootstrap4的分页组件来创建一个基本的分页效果,以及如何设置当前页、不可点击的分页链接、分页显示大小、面包屑导航、分页的对齐方式等。你可以参考这篇教程的代码和示例,修改你的HTML结构和样式。
jQuery twbsPagination插件使用方法 这篇教程介绍了如何用jQuery twbsPagination插件来实现一个动态的分页效果,以及如何设置总页数、当前页、每页显示数量、分页按钮数量、点击事件等。你可以参考这篇教程的代码和示例,引入jQuery twbsPagination插件,并在你的JS中初始化和调用它。
jQuery+Bootstrap4实现前端分页 这篇教程介绍了如何用jQuery和Bootstrap4结合来实现一个前端分页效果,以及如何获取后端返回的数据、渲染表格内容、绑定分页事件等。你可以参考这篇教程的代码和示例,修改你的AJAX请求参数和回调函数。

引用 皆我百晓生 小程序回复内容作答:
你可以使用以下的jQuery代码来实现简单的分页功能:

// 当点击页码或上一页、下一页时发送POST请求
$('.project_page_item a').click(function() {
    var page_id = $(this).parent().attr('project_page_id');
    // 发送POST请求
    $.ajax({
        url: 'your_backend_url',
        type: 'POST',
        data: {
            page: page_id
        },
        success: function(response) {
            // 更新页面内容
            // ...
        },
        error: function() {
            // 处理错误
            // ...
        }
    });
});

// 当点击页码时更新选中的页码样式
$('.project_page_item').click(function() {
    var page_index = $(this).attr('project_page_idx');
    $('.project_page_item').removeClass('active');
    $(this).addClass('active');
    
    // 判断选中的页码是否需要展示在中间
    if (page_index >= 3 && page_index < total_page - n) {
        // 移动选中的页码到中间位置
        // ...
    }
});

上述代码会在点击页码或上一页、下一页时发送一个POST请求,你需要将your_backend_url替换为你的后端URL。在success回调函数中,你可以根据返回的数据来更新页面内容。

另外,点击页码时会更新选中的页码样式。你需要先找到当前选中的页码所在的li元素,并去掉其它页码的选中样式。然后,根据你的逻辑来判断是否需要将选中的页码展示在中间位置。你可以使用jQuery的DOM操作来实现。

希望这些代码能够帮到你实现分页功能!

援引讯飞星火:
首先,我们需要在HTML中添加一个表单,用于提交分页请求。然后,我们需要编写jQuery代码,监听分页按钮的点击事件,并在点击时发送POST请求。最后,我们需要处理返回的数据,更新分页信息。

  1. 在HTML中添加表单:
<form id="pagination-form">
    <input type="hidden" name="page" id="page" value="">
</form>
  1. 编写jQuery代码:
$(document).ready(function() {
    // 初始化分页信息
    let pageInfo = {
        'has_previous': true,
        'has_next': true,
        'current_page_num': 1,
        'total_page': 5,
        'page_queryset_count': 10,
        'prevous_page_num': 1,
        'next_page_num': 5
    };

    // 更新分页信息
    function updatePaginationInfo(newPageInfo) {
        pageInfo = newPageInfo;
        updatePagination();
    }

    // 更新分页按钮状态
    function updatePagination() {
        let $navLinks = $('#create_project_modal_pagination .pagination a');
        $navLinks.removeClass('active');
        if (pageInfo.has_previous && pageInfo.current_page_num > 1) {
            $navLinks.eq(pageInfo.current_page_num - 1).addClass('active');
        }
        if (pageInfo.has_next && pageInfo.current_page_num < pageInfo.total_page) {
            $navLinks.eq(pageInfo.current_page_num + 1).addClass('active');
        }
    }

    // 初始化分页信息并更新分页按钮状态
    updatePaginationInfo(pageInfo);

    // 监听分页按钮点击事件
    $('#create_project_modal_pagination .pagination a').on('click', function() {
        let url = $(this).attr('href');
        let pageNum = $(this).text();
        $('#page').val(pageNum);
        $.post('/your-url/', {
            'page': pageNum
        }, function(data) {
            updatePaginationInfo(data.page_data);
        });
    });
});
  1. 在Django视图中处理POST请求:
from django.http import JsonResponse
from django.core.paginator import Paginator

def your_view(request):
    page_data = request.POST.get('page_data', {})
    page_queryset = page_data.get('page_queryset', [])
    has_previous = page_data.get('has_previous', True)
    has_next = page_data.get('has_next', True)
    current_page_num = int(page_data.get('current_page_num', 1))
    total_page = int(page_data.get('total_page', 1))
    page_queryset_count = int(page_data.get('page_queryset_count', 10))
    prevous_page_num = int(page_data.get('prevous_page_num', 1))
    next_page_num = int(page_data.get('next_page_num', 5))

    paginator = Paginator(page_queryset, page_queryset_count)
    page_range = range(1, total_page + 1)
    page_list = [{'number': i, 'is_current': i == current_page_num} for i in page_range]

    data = {
        'page_data': {
            'page_queryset': paginator.page(current_page_num),
            'has_previous': has_previous,
            'has_next': has_next,
            'current_page_num': current_page_num,
            'total_page': total_page,
            'page_queryset_count': page_queryset_count,
            'prevous_page_num': prevous_page_num,
            'next_page_num': next_page_num,
            'page_list': page_list
        }
    }
    return JsonResponse(data)

这样,当用户点击分页按钮时,页面将发送POST请求到Django视图,视图将处理分页逻辑并返回分页数据。然后,jQuery代码将更新分页信息并显示选中的页码。

【以下回答由 GPT 生成】

首先,我们需要添加一个用于监听分页点击事件的jQuery代码块,来处理分页事件,并向后端发送请求获取对应页面的数据。在代码中使用了AJAX技术来异步获取数据,并使用模板引擎将数据渲染到页面上。以下是完整的实现方案:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/4.6.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.7/handlebars.min.js"></script>

<script>
    $(document).ready(function() {
        $('.pagination-container').on('click', '.page-link', function(e) {
            e.preventDefault(); // 阻止默认跳转
            var pageId = $(this).parent().attr('project_page_id');
            if (pageId) {
                // 发送请求获取对应页面的数据
                $.ajax({
                    url: '/api/getPageData', // 替换为实际的后端接口地址
                    type: 'GET',
                    data: {
                        page: pageId
                    },
                    dataType: 'json',
                    success: function(response) {
                        // 使用模板引擎渲染数据
                        var template = Handlebars.compile($("#project-template").html());
                        var html = template(response.data);
                        $("#project-list").html(html);
                    },
                    error: function(error) {
                        console.log(error);
                    }
                });
            }
        });
    });
</script>

<!-- 添加一个模板引擎的script标签,并定义模板 -->
<script id="project-template" type="text/x-handlebars-template">
  {{#each this}}
  <li class="project-item">{{name}}</li>
  {{/each}}
</script>

上述代码中的/api/getPageData是一个后端接口地址,你需要将其替换为你实际使用的接口地址,用于获取对应页面的数据。接口返回的数据格式应为JSON,示例如下:

{
  "data": [
    {
      "name": "项目1"
    },
    {
      "name": "项目2"
    },
    ...
  ]
}

在模板引擎的script标签中定义了模板,模板中的{{#each this}}表示遍历数据数组,{{name}}表示获取每个项目对象中的name属性值。

最后,你需要将数据渲染到页面中的一个容器,例如添加一个id为project-list的ul元素:

<ul id="project-list"></ul>

这样,当用户点击分页按钮时,将触发jQuery的点击事件处理程序,发送AJAX请求获取对应页面的数据,并使用模板引擎渲染数据到页面上的project-list容器中。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

可以引入一些简单的前端组件,比如采用layui等,它包装了许多的表格和分页的例子,照着写就可以用的。

https://getbootstrap.net/docs/components/pagination/

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的代码和需求,我可以为您提供一个简单的实现分页的示例代码。以下是基于您提供的 HTML 结构和要求进行的修改:

$(document).ready(function() {
  // 当点击页码或上一页、下一页时,发送 post 请求
  $('.project_page_item').on('click', function() {
    var pageId = $(this).attr('project_page_id');
    if (pageId) {
      var postData = {
        page: pageId
        // 其他需要发送的参数
      };

      // 发送 post 请求
      $.post('/your-api-endpoint', postData, function(response) {
        // 处理返回的响应数据
        // 更新页面内容或其他操作
      });
    }
  });
});

在上述代码中,我们使用 jQuery 监听了 .project_page_item 元素的点击事件。当点击页码或上一页、下一页时,获取对应的页码 project_page_id 并发送 post 请求。您需要将 /your-api-endpoint 替换为您实际的后端 API 端点,以处理分页请求。

关于选中页码展示在中间且数字自然排列的需求,这部分逻辑可以在后端生成 HTML 时处理,将选中的页码放在适当的位置。在前端,您可以在接收到后端返回的数据后,根据返回的页码信息更新分页 HTML。

这只是一个简单的示例,您可能需要根据您的具体需求进行修改和定制。另外,请确保与后端 API 的交互和数据处理逻辑是正确的。

希望这可以帮助您实现简单的前端分页功能。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

首先,确保你已经引入了 jQuery 和 Bootstrap 的库。在页面中添加如下引用:

<!-- 引入 jQuery -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<!-- 引入 Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">

<!-- 引入 Bootstrap JS -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>

在 HTML 中创建一个容器来显示分页:

<div id="pagination-container" class="float-right">
    <nav aria-label="Page navigation">
        <ul class="pagination">
            <!-- 这里将使用 jQuery 动态生成分页项 -->
        </ul>
    </nav>
</div>
  1. 使用 JavaScript 生成分页项。你可以在页面加载完成后执行以下代码:
$(document).ready(function() {
    // 假设以下数据是从后端获取的
    var page_data = {
        'page_queryset': ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6'],
        'has_previous': true,
        'has_next': true,
        'current_page_num': 1,
        'total_page': 3
    };
    
    // 分页容器
    var $paginationContainer = $('#pagination-container');
    var $paginationList = $paginationContainer.find('.pagination');
    
    // 清空分页容器
    $paginationList.empty();
    
    // 上一页
    if (page_data.has_previous) {
        $paginationList.append('<li class="page-item"><a class="page-link" data-page="' + (page_data.current_page_num - 1) + '">Previous</a></li>');
    }
    
    // 页码
    for (var i = 1; i <= page_data.total_page; i++) {
        var activeClass = (i === page_data.current_page_num) ? 'active' : '';
        $paginationList.append('<li class="page-item ' + activeClass + '"><a class="page-link" data-page="' + i + '">' + i + '</a></li>');
    }
    
    // 下一页
    if (page_data.has_next) {
        $paginationList.append('<li class="page-item"><a class="page-link" data-page="' + (page_data.current_page_num + 1) + '">Next</a></li>');
    }
    
    // 点击页码时的事件处理
    $paginationContainer.on('click', 'a.page-link', function(e) {
        e.preventDefault();
        
        // 获取点击的页码
        var clickedPage = $(this).data('page');
        
        // 在这里可以根据点击的页码执行相应的操作,例如刷新内容
        // 此处可以模拟刷新内容,实际情况中请根据需求修改
        var content = '<p>Page ' + clickedPage + ' Content</p>';
        $('#content').html(content);
        
        // 更新分页状态
        page_data.current_page_num = clickedPage;
        updatePagination();
    });
    
    // 更新分页状态
    function updatePagination() {
        // 清空分页容器
        $paginationList.empty();
        
        // 上一页
        if (page_data.has_previous) {
            $paginationList.append('<li class="page-item"><a class="page-link" data-page="' + (page_data.current_page_num - 1) + '">Previous</a></li>');
        }
        
        // 页码
        for (var i = 1; i <= page_data.total_page; i++) {
            var activeClass = (i === page_data.current_page_num) ? 'active' : '';
            $paginationList.append('<li class="page-item ' + activeClass + '"><a class="page-link" data-page="' + i + '">' + i + '</a></li>');
        }
        
        // 下一页
        if (page_data.has_next) {
            $paginationList.append('<li class="page-item"><a class="page-link" data-page="' + (page_data.current_page_num + 1) + '">Next</a></li>');
        }
    }
    
    // 初始化分页
    updatePagination();
});

监听分页组件的页码变化事件,在事件的回调函数中调后端的分页接口获取数据即可。

结合GPT给出回答如下请题主参考
对于使用Bootstrap4的前端简单分页实现,可以使用以下步骤:

1.在HTML文件中添加一个分页容器:

<div class="pagination-container"></div>

2.使用jQuery和Bootstrap的JavaScript文件来实现分页功能。

// 定义每页显示的条目数
var pageSize = 10;
// 获取需要分页的元素
var $tableRows = $("table tbody tr");
// 计算总页数
var pageCount = Math.ceil($tableRows.length / pageSize);
// 初始化分页插件
$(".pagination-container").bootstrapPaginator({
    // 设置当前页码
    currentPage: 1,
    // 设置总页数
    totalPages: pageCount,
    // 显示总页数
    shouldShowPageCount: true,
    // 显示总条目数
    shouldShowTotal: true,
    // 显示首页和尾页
    shouldShowFirstLast: true,
    // 显示前一页和后一页
    shouldShowPrevNext: true,
    // 点击某个页码时执行的回调函数
    onPageClicked: function(event, originalEvent, type, page) {
        // 获取当前页要显示的数据
        var startIndex = (page - 1) * pageSize;
        var endIndex = startIndex + pageSize;
        $tableRows.hide();
        $tableRows.slice(startIndex, endIndex).show();
    }
});

需要注意的是,上述代码中的 shouldShowPageCountshouldShowTotalshouldShowFirstLastshouldShowPrevNext 参数可以根据具体需求进行调整。

希望这些信息可以对你有所帮助。

请问还需要否~~你的实际技术栈是什么

不用那么复杂的,bt有自己的分页插件,可以直接用

使用 jQuery 处理分页的点击事件和更新页面数据的逻辑。你可以创建一个 JavaScript 文件并将其包含在 HTML 文件中。示例代码如下:

<!-- 引入 jQuery -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<!-- 引入 Bootstrap 样式和 JavaScript -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>

<!-- 引入你的分页控件 HTML -->
<div class="pagination-container float-right" id="create_project_modal_pagination">
    <!-- ... 这里放你的分页控件 ... -->
</div>

<!-- 引入你的分页逻辑 JavaScript -->
<script src="path/to/your/pagination.js"></script>


在你的分页逻辑 JavaScript 文件中,你可以监听分页按钮的点击事件,并发送 POST 请求来获取相应的数据。同时,你可以根据返回的数据来更新页码的显示。以下是一个简化的示例:

$(document).ready(function() {
    // 默认加载第一页数据
    loadPageData(1);

    // 监听分页按钮点击事件
    $('#create_project_modal_pagination .page-link').click(function(event) {
        event.preventDefault();
        var page = $(this).data('page'); // 获取点击的页码
        loadPageData(page);
    });
});

function loadPageData(page) {
    // 发送 POST 请求,携带参数 page=page
    $.post('/your-api-endpoint', { page: page }, function(data) {
        // 更新数据展示部分,这里需要根据你的页面结构来实现
        // 更新页码样式
        // ...
    });
}


用jQuery和bootstrap实现分页器

bootstrap4有分页控件