动态加载HTML片段需用DOMParser解析并提取body/head节点,手动处理script和link标签以确保执行与样式生效,避免XSS;懒加载用IntersectionObserver并加loading锁;实时推送用EventSource配合指数退避重连。

用 fetch() 加载 HTML 片段并插入 DOM
直接请求外部 HTML 文件(如 section-news.html)再注入页面,是最常用且可控的动态加载方式。关键不是“能不能”,而是“怎么插才不崩脚本、不丢样式、不触发 XSS”。
常见错误现象:innerHTML = responseText 后,新内容里的 <script></script> 不执行;或 CSS 样式没生效;或点击事件绑定失效。
- 必须用
DOMParser解析响应文本,再从生成的文档中提取body和head子节点——不能直接拼字符串 - 插入前清空容器:用
container.innerHTML = ''比removeChild更稳妥,但要确保没有监听器残留 - 若新 HTML 含
<script src="..."></script>,需手动创建script元素并append()到document.head或容器内 - 内联
<script>console.log('x')</script>在innerHTML赋值后默认不执行,必须用eval()或重新创建 script 元素(不推荐 eval)
用 IntersectionObserver 实现滚动到底部自动加载
懒加载不是“等用户点按钮”,而是监听容器底部是否进入视口,适合长文章列表、商品瀑布流等场景。它和 scroll 事件比,性能更好、兼容性够用(Chrome 51+/Firefox 55+/Safari 12.1+)。
容易踩的坑:observer.observe(target) 只调一次就停了;目标元素被移除后没重建;重复触发请求没加防抖或 loading 锁。
- 占位元素建议用 ,避免影响布局又足够灵敏
- 回调里先
observer.unobserve(target),再发请求;成功后重新observe(target)或插入新占位- 务必加 loading 状态变量,比如
let isLoading = false,请求开始设为true,完成或失败后重置- 如果列表是服务端分页,记得把当前页码存为变量,而不是硬编码在 URL 里,例如
fetch(`/api/articles?page=${pageNum}`)用
EventSource接收服务端实时推送当后台持续有新文章产生(比如新闻站、聊天室),
EventSource比轮询更省资源、延迟更低。但它只支持 GET,且服务端必须返回Content-Type: text/event-stream并保持连接。典型问题:断连后不重连;收到重复数据;消息体格式错导致
event.data解析失败。- 服务端推送格式必须严格:以
data:开头,结尾双换行标题
\n\n - 前端用
new EventSource('/events')创建实例,监听message事件,不要用open事件做初始化逻辑 -
error回调里不能直接new EventSource,要加指数退避,例如setTimeout(() => new EventSource(...), 1000 * Math.pow(2, retryCount)) - 插入内容优先用
insertAdjacentHTML('afterbegin', data)放顶部,避免滚动跳动;若放底部,注意防抖防止快速刷屏
动态加载时如何安全处理脚本与样式
这是最常被忽略的一环:HTML 片段里带的
<script></script>和不会自动执行或加载。你看到内容渲染了,但交互和样式可能残缺。别指望浏览器替你补全逻辑——它只按规范执行,而规范里明确写了“通过
innerHTML插入的 script 不执行”。- 提取新 HTML 中所有
,遍历创建link元素并append()到document.head - 提取所有
<script src="..."></script>,逐个fetch内容后eval()(仅限可信源)或创建script元素并src赋值 - 内联脚本(
<script>xxx</script>)需提取textContent后eval(),但必须确认来源绝对可信,否则 XSS 风险极高 - 更稳的做法是把业务逻辑抽成独立模块(如
window.loadNewsSection = function() {...}),在 HTML 插入后显式调用
实际部署时,
DOMParser的兼容性没问题,但它的输出文档是隔离环境,document.querySelector在里面查不到全局已加载的组件。这点很容易被当成 bug 折腾半天。 - 回调里先
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











