You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

AJAX加载场景下的分页功能实现困惑:如何在自动生成的分页链接中使用loadList()

AJAX加载场景下的分页功能实现困惑:如何在自动生成的分页链接中使用loadList()

嘿,我太懂你现在的卡点了!这种自动生成的分页链接,直接绑事件根本不管用,毕竟页面加载完后才动态生成的元素,之前写的点击事件根本监听不到对吧?别慌,我给你捋捋实操的解决思路:

首先,事件委托是核心!我们不能直接给动态生成的分页链接绑事件,得把事件绑定在它的静态父容器上——也就是页面加载时就存在的那个包裹分页的元素,比如你可能有个<div class="pagination-container">用来放分页按钮。这样不管里面的分页链接怎么动态更新,点击事件都能被监听到。

举个具体的代码例子:

// 给分页的静态父容器绑定点击事件
document.querySelector('.pagination-container').addEventListener('click', function(e) {
  e.preventDefault(); // 先阻止默认的页面跳转行为
  // 确认点击的是分页链接
  if (e.target.tagName === 'A' && e.target.classList.contains('page-link')) {
    // 拿到当前要跳的页码——这里假设你的分页链接加了data-page属性存页码
    const targetPage = e.target.getAttribute('data-page');
    // 同时获取当前搜索框里的关键词
    const currentSearch = document.querySelector('#search-input').value;
    // 调用你的loadList,把页码和搜索词传进去
    loadList(targetPage, currentSearch);
  }
});

然后,你需要稍微改造一下loadList()函数,让它能接收页码搜索关键词这两个参数,这样不管是分页切换还是搜索,都能把参数传给后端拿到对应的数据:

function loadList(page = 1, searchQuery = '') {
  // 这里用fetch发起AJAX请求,你也可以用XMLHttpRequest
  fetch(`/你的接口地址?page=${page}&search=${encodeURIComponent(searchQuery)}`)
    .then(res => res.json())
    .then(data => {
      // 把返回的列表HTML渲染到页面的列表容器里
      document.querySelector('.list-container').innerHTML = data.listHtml;
      // 别忘了更新分页容器的内容——因为搜索后总页数可能变了,后端要返回新的分页HTML
      document.querySelector('.pagination-container').innerHTML = data.paginationHtml;
    })
    .catch(err => console.log('加载数据出错啦:', err));
}

另外,搜索功能那边也要配合调用loadList,比如搜索按钮点击或者回车时:

// 搜索按钮点击事件
document.querySelector('#search-btn').addEventListener('click', function() {
  const searchVal = document.querySelector('#search-input').value;
  loadList(1, searchVal); // 搜索默认从第一页开始
});

// 回车触发搜索
document.querySelector('#search-input').addEventListener('keypress', function(e) {
  if (e.key === 'Enter') {
    loadList(1, this.value);
  }
});

最后提个小细节:如果你的后端生成分页链接时没加data-page属性,也可以从链接的href里解析页码,比如用URL对象:

const linkUrl = new URL(e.target.href);
const targetPage = linkUrl.searchParams.get('page');

这样就不用改后端生成分页的逻辑啦。

核心逻辑就是:用事件委托搞定动态元素的事件监听,让loadList能接收分页和搜索参数,后端配合返回对应的列表和分页HTML,就能实现无刷新的搜索+分页啦!

内容来源于stack exchange

火山引擎 最新活动