浏览器支持与渐进增强¶
学习目标¶
- 区分语法支持、API 存在和功能可用。
- 使用特性检测而不是浏览器嗅探。
- 为不支持或受限环境提供可理解的回退。
支持不是一个布尔值¶
浏览器“支持”某功能,可能只表示能解析元素或存在某个方法。编码格式、权限策略、 设备能力、用户设置、辅助技术和嵌入环境仍会改变最终行为。HTML Living Standard 持续更新,实际采用范围应结合兼容数据和真实设备测试判断。
安全可运行示例¶
下面检测 dialog 的关键方法;不支持时保留普通内容,不下载未知 polyfill:
<button id="open" type="button">查看说明</button>
<dialog id="help">
<p>这是浏览器原生对话框。</p>
<form method="dialog"><button>关闭</button></form>
</dialog>
<p id="fallback" hidden>当前浏览器不支持对话框,请直接阅读本段说明。</p>
<script>
const button = document.querySelector('#open');
const dialog = document.querySelector('#help');
const fallback = document.querySelector('#fallback');
button.addEventListener('click', () => {
if (typeof dialog.showModal === 'function') dialog.showModal();
else fallback.hidden = false;
});
</script>
检测应靠近实际使用点。'geolocation' in navigator 只能说明接口存在,不能说明用户
会授权,也不能保证定位成功;每个异步 API 仍需处理拒绝、超时和不可用状态。
渐进增强¶
渐进增强从可用的 HTML 核心开始,再增加样式和交互。例如表单应有正常的 action
和服务端处理,JavaScript 仅用于即时提示;网络或脚本失败时仍可提交。
优雅降级则从完整功能出发再处理旧环境。两者可结合,但都不能把安全检查只放在前端。
测试策略¶
- 根据访问数据和产品要求定义支持矩阵,不盲目追求所有旧版本。
- 测试 Chromium、Firefox、WebKit 系浏览器以及至少一台真实移动设备。
- 测试键盘导航、200% 缩放、减少动态效果和高对比度设置。
- 对媒体检查实际编码,不只检查
video或audio元素是否存在。 - 对权限 API 测试允许、拒绝、撤销、超时和非 HTTPS 场景。
Polyfill 与安全¶
Polyfill 是用现有能力模拟新 API 的代码,不能模拟浏览器缺失的底层设备或安全能力。 只从可信来源引入,固定版本并纳入依赖审计;不要运行根据 User-Agent 动态返回的未知脚本。
兼容与无障碍¶
回退必须提供相同任务,而不只是显示“不支持”。例如拖放应有按钮或文件选择器, Canvas 图表应有数据表,媒体应有字幕、文字稿和下载链接。隐藏回退前要确认增强功能可用。
常见错误¶
- 解析 User-Agent 后维护大量版本分支。
- 只检测属性存在,不处理调用失败或权限拒绝。
- 用 JavaScript 写入本可直接存在于 HTML 的关键内容。
- 为旧浏览器加载来源不明、长期不更新的 polyfill。
- 把视觉一致误认为功能、键盘和读屏体验一致。