需先调用window.h5api.isLogin()检查登录态,未登录则调用login()获取uid/openid;提交分数须经平台认证通道(或由后端校验入库);拉榜需fetch自己服务器接口,注意跨域、data.code业务态判断、rank转数字排序及Canvas/DOM层z-index与缩放适配。

怎么用 window.h5api 提交分数并拉取排行榜
HTML5小游戏接入平台排行榜,核心依赖渠道 SDK 提供的统一接口(如 window.h5api),不是自己写个 fetch 就能直接连后台的。你提交的分数必须走平台认证通道,否则会被拒绝或无法计入榜单。
典型流程是:游戏结束 → 调用 window.h5api.submitScore()(如果平台支持)或先调用登录态检查 → 再发分 → 最后拉榜。但注意:很多平台(如微信、OPPO、vivo 小游戏)不直接暴露 submitScore,而是要求你先调用 window.h5api.login() 获取用户唯一标识(如 openid 或 uid),再把该 ID 和分数一起 POST 到你自己的服务器,由后端完成校验与入库。
- 务必先执行
window.h5api.isLogin(),未登录时调用window.h5api.login(callback),否则后续操作可能静默失败 - 不要在未确认登录成功前就尝试提交——
callback中的data.uid或data.openid是你后续请求自己排行榜接口的必要凭证 - 平台侧通常不提供「实时拉取全榜」的 JS 接口;
window.h5api.getRankList()这类方法极少存在,绝大多数需你自行实现 HTTP 请求
用 fetch 拉取自己服务器的排行榜数据
拉榜这一步是你完全可控的,但也是最容易出错的环节:跨域、状态码误判、数据结构不匹配,三者占了 80% 的调试时间。
假设你的接口是 /api/rank?uid=xxx,返回格式为:{"code":200,"data":[{"rank":1,"name":"玩家A","score":9999}]},那正确写法是:
立即学习“前端免费学习笔记(深入)”;
fetch('/api/rank?uid=' + encodeURIComponent(uid))
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.then(data => {
if (data.code !== 200) throw new Error(data.message || '榜单获取失败');
renderRankList(data.data);
})
.catch(err => console.error('拉榜失败:', err));
-
credentials: 'include'必须加,否则 Cookie 或 session 不会发送,导致未登录态被拦截 - 别只看
res.status === 200,后端常统一返回 200,靠data.code判断业务逻辑是否成功 -
前端拿到的 rank 字段可能是字符串,排序前记得
parseInt(item.rank),否则会出现 “1, 10, 2” 这种排序错误
排行榜界面渲染要注意 Canvas 和 DOM 混合的坑
如果你用的是青瓷引擎、LayaAir 或纯 Canvas 渲染游戏,但排行榜是用 DOM 做的(比如 常见现象:排行榜弹出来,但点不动按钮;或者在 iPhone 上文字模糊、位置偏移。根本原因往往是 Canvas 全屏覆盖了 DOM 层,或 CSS 缩放没同步。 这个问题几乎必现,根源不在代码,而在浏览器策略:本地打开 HTML 文件( 真正卡住人的从来不是“怎么写排行榜”,而是登录态怎么透传、分数怎么防刷、榜单数据怎么缓存、以及 DOM 和 Canvas 渲染层打架时谁该让步——这些细节没对齐,接口通了也没用。
style.zIndex 高于 Canvas(例如设为 9999),且 pointer-events: auto
transform: scale(0.5) 适配高清屏,DOM 层也要做同样缩放,否则点击区域错位RankItem.js)要主动管理资源:头像图片加载后记得缓存 key,切换榜单项时调用 unload() 防止内存泄漏为什么本地测试总显示“无数据”,但线上正常?
file:// 协议)下,fetch 和 XMLHttpRequest 默认禁用跨域,即使你后端开了 CORS,浏览器也不发 Origin 头,服务端收不到请求。
npx http-server)--unsafely-treat-insecure-origin-as-secure="file://" 是黑魔法,仅限临时调试,不可用于交付localhost 的限制更严,建议尽早部署到测试域名(哪怕只是 test.yourgame.com)











