用HTML+JS渲染实时好友挑战排行榜需用数组存储好友数据,JavaScript排序(胜率降序)、防XSS转义、缓存DOM元素、批量更新Fragment,并兼容IE11的sort写法。

怎么用 HTML + JS 渲染实时好友挑战排行榜
纯 HTML 无法动态排序或计算胜率,必须配合 JavaScript。核心是把好友数据用 Array 存好,再用 sort() 按胜率降序排,最后用 innerHTML 或 insertAdjacentHTML() 插入表格行。
- 别直接拼接字符串塞进
innerHTML,容易 XSS;如果数据来自后端,先用textContent设文本,或对字段做简单转义(比如str.replace(/&/g, "&")) - 胜率建议统一存为小数(如
0.75),不是百分比字符串(如"75%"),否则sort()会按字典序错乱 - 表格每行用
data-id属性绑定好友唯一标识,方便后续点击“发起新挑战”时取值
胜率怎么算才不翻车:除零、未比赛、小数精度
胜率 = wins / (wins + losses),但真实场景里常有分母为 0(没打过任何局)或只有平局(HTML 挑战通常不计平局,但数据字段可能残留)。
- 分母为 0 时,返回
0或NaN都不好展示,建议统一设为0,并在 UI 上显示“暂无战绩”而不是 “0%” - 避免用
toFixed(1)直接截小数——它会四舍五入且返回字符串,导致后续排序失效;应先用Math.round(winRate * 10) / 10得数字,再转显示用的字符串 - 如果后端返回的是整数胜场/负场,前端不要自己拼百分比字符串,留到渲染时再算,避免缓存或重复计算
DOM 更新卡顿?别在循环里反复查 document.getElementById
排行榜每秒可能刷新一次(比如 WebSocket 推送新结果),如果每次都在 for 循环里调用 document.querySelector(".rank-list"),性能会明显下降。
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
- 把容器元素缓存成变量:
const listEl = document.querySelector(".rank-list"),只查一次 - 批量更新:先用
document.createDocumentFragment()组装所有,再一次性 append 到列表,比逐个 appendChild快得多- 如果用
innerHTML = htmlString,注意老浏览器中事件监听器会丢失,已绑定的“挑战按钮”点击事件需重新绑定或改用事件委托(listEl.addEventListener("click", e => { if (e.target.matches("[data-action='challenge']")) ... }))IE11 兼容不了
Array.prototype.sort的箭头函数写法?像
friends.sort((a, b) => b.winRate - a.winRate)在 IE11 会报语法错误,因为不支持箭头函数,且Number.NaN排序行为也不一致。- 改用传统函数:
friends.sort(function(a, b) { return (b.winRate || 0) - (a.winRate || 0); }) -
|| 0是必须的——IE11 对NaN - 0返回NaN,而sort遇到NaN会打乱顺序 - 如果项目已放弃 IE,可忽略这点;但若仍需兼容,连
const、let都得换成var,并避免使用includes()、find()等新 API
胜率统计本身逻辑简单,真正花时间的是边界处理和 DOM 更新节奏——比如用户刚赢一局,排行榜还没刷新,他点“再挑战”按钮时,得确保拿到的是最新胜率,而不是页面上还显示着旧数据。这类状态同步问题,光靠 HTML 和 CSS 压根解决不了。
- 如果用
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










