特性检测与渐进增强
特性检测与渐进增强
机制拆解
特性检测的结果必须改变业务路径,而不是只打印一个布尔值。下面页面在支持 IntersectionObserver 时懒加载图片,否则直接加载同一张图片,保证两条路径都有可见结果:
html
<img id="photo" width="320" height="180" alt="示例图片">
<script>
const image = document.querySelector('#photo')
const source = 'photo.jpg'
const load = () => { image.src = source; image.dataset.strategy = 'eager' }
if ('IntersectionObserver' in globalThis) {
const observer = new IntersectionObserver(([entry], current) => {
if (!entry.isIntersecting) return
load()
current.disconnect()
})
image.dataset.strategy = 'observer'
observer.observe(image)
} else {
load()
}
</script>在支持浏览器中滚动到图片并记录 data-strategy;在 DevTools 中关闭脚本或用不支持的浏览器模拟降级,确认图片仍能加载。检测能力,不检测浏览器名称。
边界与失败路径
- 所有权:监听器、observer、worker、连接、缓存和焦点都有创建者与释放时机;页面隐藏、路由离开和元素移除时都要验证。
- 宿主差异:SSR、Web Worker、Shadow DOM、跨文档、跨源和辅助技术不会共享同一套全局对象与事件路径。
- 错误分类:取消、超时、权限拒绝、协议错误、配额不足和浏览器不支持应分别进入可观察状态。
- 安全边界:用户输入、URL、HTML、消息和持久化数据不能仅因为来自同源或类型正确就视为可信。
可运行实验
准备一个可加载的 photo.jpg,分别在支持 IntersectionObserver 的浏览器和禁用该 API 的环境中运行示例。记录图片的 data-strategy、网络请求时机和最终可见结果;两条路径都必须显示图片,只允许加载时机不同。
实验记录要注明如何制造“不支持”路径(删除能力或使用目标浏览器),不要把改 User-Agent 当作能力检测。
练习
- 删除
IntersectionObserver分支中的load(),预测支持浏览器中的可见结果,并写出回归断言。 - 把检测改成浏览器名称判断,列举一个名称相同但能力不同的风险,说明为什么能力检测更可靠。
- 为图片加载失败增加占位文本,说明渐进增强仍需覆盖资源错误,而不只是 API 不支持。
下一步
完成练习后回到本章概览,按下一篇继续;遇到跨章节故障,先回到本节的所有权与宿主边界。