应使用 data- 属性存储阶梯规则,如 data-quantity-start、data-quantity-end、data-price,避免硬编码;配合 input 事件防抖(200ms)、textContent 安全渲染及 type="text"+inputmode="numeric" 兼容处理。

用 data- 属性存阶梯规则,别硬写进 JS 逻辑里
阶梯价格本质是「数量区间 → 单价」的映射,直接把规则写死在 JS 里会导致改个价格就要发版。应该让 HTML 自带结构化数据:data-quantity-start、data-quantity-end、data-price 这三个属性配对出现在每个阶梯项上。后端渲染时生成这些属性,前端只负责读取和计算。这样运营改价、增删阶梯,只需改模板或 CMS 配置,不碰 JS。
常见错误是用 class 名模拟数据,比如 class="tier-10-50-29.9" —— 解析麻烦、易冲突、无法被屏幕阅读器识别。用 data- 是语义正确且可扩展的。
监听 input 事件做实时计算,但防抖必须加
用户在数量输入框()里狂点或手输时,频繁触发价格重算会卡顿,尤其阶梯多、还要联动运费/优惠券时。必须用 200ms 级别的防抖,不是节流。
- 用
addEventListener('input', ...),不是change—— 后者要失焦才触发,体验断层 - 防抖函数里先清掉上一次的
setTimeout,再设新定时器 - 输入非法值(如负数、非数字)时,立即 fallback 到默认阶梯(通常是第一档),别等用户修正
渲染时优先用 textContent,别拼接 HTML 字符串
阶梯价格模块常含「¥29.90 / 件」、「满 50 件 ¥24.50」这类混合文本,容易想当然用 innerHTML 拼接。但若后端没严格过滤,data-price 里混入 <script></script> 就有 XSS 风险。
正确做法是:用 document.createTextNode() 或直接赋值 textContent,把价格数字、单位、条件文字拆成独立节点插入。例如:
实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
const priceNode = document.querySelector('.price-current');
priceNode.textContent = '¥' + currentTierPrice.toFixed(2);
const unitNode = document.querySelector('.price-unit');
unitNode.textContent = ' / 件';
这样既安全,又方便后续用 CSS 单独控制「¥」字号或颜色。
移动端要注意 input[type="number"] 的兼容性坑
安卓部分 WebView 和旧版 iOS Safari 里,type="number" 会强制唤出数字键盘,但可能吞掉粘贴、禁用长按选中,甚至把小数点变成逗号(如德语环境)。真实场景中,用户更习惯手输或粘贴数量。
- 降级方案:用
type="text"+inputmode="numeric"(现代浏览器支持)+ 正则限制输入内容 - 监听
keydown拦截非数字键,但允许Backspace、Delete、Arrow键 - 输入框获得焦点时,自动全选已有值,减少用户操作步骤
阶梯价格看着简单,真正难的是边界处理:0 件怎么显示、超最大阶梯怎么兜底、库存不足时是否隐藏后续阶梯——这些细节没对齐,前端再漂亮也白搭。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










