后端必须返回结构化 JSON,而不是手搓 HTML 片段。前端用 insertAdjacentHTML 追加,别碰 innerHTML —— 否则不仅会重绘整个 DOM、破坏页面语义,还会给 XSS 攻击留后门。这看似是基本功,但生产环境里翻车的案例一点都不少。 后端接口该返回什么字段 不是随便塞个
后端必须返回结构化 JSON,而不是手搓 HTML 片段。前端用 insertAdjacentHTML 追加,别碰 innerHTML —— 否则不仅会重绘整个 DOM、破坏页面语义,还会给 XSS 攻击留后门。这看似是基本功,但生产环境里翻车的案例一点都不少。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
不是随便塞个数组就能搞定。关键字段必须明确且稳定,这里有几个必须包含的要素:
items:本次要插入的条目数组,结构必须与首屏完全一致(比如每项都包含 id、title、content)has_more:布尔值,决定“加载更多”按钮是否继续显示。千万别只看 items.length === 0 就判定到底,否则一旦接口返回空(比如出错),用户看到的按钮就消失了next_offset 或 next_cursor:下一次请求的分页参数。避免前端用 offset + 10 硬算,那样容易跳页或重复拉取,数据对不上html 字段或带标签的字符串。这是安全红线核心原则是“不破坏已有 DOM 结构”。用 innerHTML += 看起来很省事,但实际上是冲击波:
container.insertAdjacentHTML('beforeend', htmlString),只把新的 HTML 片段插到末尾,不影响已有的任何内容items.map() 拼字符串,或者直接 document.createElement 构建节点再通过 append 挂上去id 或 class,别用 document.querySelector('button') 这种模糊选择器,万一页面结构变了,父容器都可能找错见过不少项目,90% 的“点不动”问题都出在这几个地方:
但没写 type="button",或者被包在 里,点击默认就提交表单了。必须加 event.preventDefault(),或者直接指定 type="button"button.disabled = true,结束再恢复is-loading 类,用户看不到反馈,以为页面卡死了,又猛点。建议配合 CSS 显示骨架屏,或者把按钮文字改成“加载中…”用户快速点两次,第二次请求先回来,直接把第一次的数据冲掉了。这不是 UI 显示问题,而是请求生命周期没管住:
abortController.abort()(记得在 fetch 里传 signal)requestId = Date.now(),成功回调里先比对 if (requestId !== latestRequestId) return真正难的不是写几行 fetch 代码,而是让“加载中”“加载失败”“已到底”这三种状态,在弱网、连点、接口抖动下都能稳得住。这些边界情况,往往上线之后才暴露出来,提前考虑好,能省下不少线上排查的时间。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述