data-page和data-total-pages必须为整数,JS中需用parseInt转换,避免字符串拼接错误;页码总数须用Math.ceil(totalCount / pageSize)动态计算,空数据时显式设为1。

data-page 和 data-total-pages 必须用整数,不能是字符串
HTML 中用 data-page 存当前页、data-total-pages 存总页数,看似简单,但常见错误是后端模板或 JS 拼接时没转成数字:data-page="1" 看似没问题,但 JS 里 el.dataset.page === "1" 是字符串,后续做 ++ 或比较会出错。
正确做法是显式转为整数:
- 服务端渲染时,确保输出的是纯数字值,比如
data-page="1"而不是data-page="'1'"或data-page="{{ page|string }}" - JS 初始化时立刻转:
const currentPage = parseInt(el.dataset.page, 10) || 1 - 避免直接用
dataset做算术,尤其dataset.page + 1会变成字符串拼接("1" + 1 === "11")
data-page-size 改变时必须同步重算 total-pages
用户点击“每页 20 条”后,data-page-size 变了,但很多人忘了重新计算 data-total-pages,导致页码栏卡死或“下一页”不可点。
关键逻辑是:总页数永远由 Math.ceil(totalCount / pageSize) 动态得出,不能缓存或硬编码。
立即学习“前端免费学习笔记(深入)”;
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- totalCount 必须来自后端返回的
total字段,绝不能用当前页数据长度data.length去算 - 当
data-page-size更新时,要重新 fetch 总数,或至少用已有totalCount重算:el.dataset.totalPages = Math.ceil(totalCount / newPageSize) - 空数据时
Math.ceil(0 / 20) === 0,此时应手动设为1,否则页码容器可能不渲染任何页码
data-index 用于内容分块翻页时必须唯一且连续
如果用 CSS 隐藏/显示多个 <section class="page"></section> 实现内容翻页(非表格),data-index 就是核心控制标识。它不是可选的装饰属性,而是 JS 切换逻辑的依据。
常见断裂点:
- index 从 0 开始还是 1 开始?必须和 JS 里的
currentPage严格对齐(推荐从 1 开始,更符合用户直觉) - 删除某页块后未重排 index,导致点击“第 3 页”却找不到
data-index="3" - 动态插入新页块但没设
data-index,或设成 NaN/undefined,querySelectorAll('[data-index]')就漏掉它
安全写法是每次生成页块时用计数器赋值:section.setAttribute('data-index', String(i + 1))。
data-pagination-target 指定作用范围时容易忽略 DOM 生命周期
当一个页面有多个分页区域(如商品列表 + 评论列表),用 data-pagination-target="#comments-table" 指向目标容器很实用。但问题常出在目标元素尚未加载完成。
典型失败场景:
- JS 在
里执行,而目标<table id="comments-table"> 还在下面没解析到 <li>目标容器是异步加载的(如通过 AJAX 插入),但分页控件初始化早于它</li> <li> <code>data-pagination-target值带空格或非法字符,比如data-pagination-target=" #comments-table ",document.querySelector()查不到
建议统一用 DOMContentLoaded 或 MutationObserver 等待目标存在;或者把初始化逻辑放到目标容器之后内联执行。
最易被忽略的一点:data- 属性本身不触发任何行为,所有逻辑都依赖你写的 JS 主动读取并响应——它只是个约定容器,不是魔法开关。


















