IE9及以下不支持HTML5表单属性和验证API,需用webshim polyfill或手写submit拦截逻辑补全;html5shiv和Modernizr无法解决此问题。

IE 浏览器(尤其是 IE9 及以下)原生不支持 HTML5 表单属性和验证 API,required、type="email"、pattern、novalidate 等直接被忽略,checkValidity() 和 reportValidity() 也不存在。这不是“失效”,是根本没实现。
IE 不识别 HTML5 表单属性的典型表现
用户提交空的 required 输入框毫无提示;输入非法邮箱却能通过;type="number" 渲染成普通文本框且无上下箭头;调用 form.checkValidity() 报错 Object doesn't support property or method 'checkValidity'。
根本原因:IE9–10 的 DOM 实现未扩展表单元素的 HTML5 属性与方法,连 HTMLInputElement.prototype 都没有挂载这些接口。
- IE6–8:完全无 HTML5 表单概念,连
type="email"都当作type="text"处理 - IE9:支持部分语义化标签(如
article),但表单验证属性全不识别 - IE10:开始支持
placeholder,但required、pattern、验证 API 仍缺失
用 webshim lib 补全 IE 的 HTML5 表单能力
webshim 是目前最成熟、轻量(压缩后约 40KB)、且专注 polyfill 的方案,它不模拟 UI,而是注入真实验证逻辑并绑定到原生事件(如 submit、input),兼容性覆盖 IE7+。
立即学习“前端免费学习笔记(深入)”;
使用步骤:
- 引入
webshim.js和webshim.css(后者仅用于可选的错误提示样式) - 在
<script>中启用表单模块:<script> webshim.setOptions('forms-ext', {replaceUI: false}); webshim.polyfill('forms forms-ext'); </script> - 确保页面加载完 DOM 后再执行 polyfill(推荐放在
</body>前)
启用后,required 字段失焦时自动校验,form.reportValidity() 可正常调用,input.validity.valid 返回布尔值——行为与现代浏览器一致。
手动 fallback:最小化 JS 验证补丁
若项目不能引入第三方库,需手写轻量校验逻辑。重点不是重写整个验证引擎,而是拦截关键行为:
- 监听
form.submit,遍历所有带required的input,检查.value.trim() === '' - 对
type="email",用正则/^[^\s@]+@[^\s@]+\.[^\s@]+$/做基础校验(不追求 RFC5322 全兼容) - 对
pattern属性,提取input.getAttribute('pattern')并用new RegExp(pattern).test(value) - 校验失败时,调用
input.focus()并显示自定义提示(IE 不支持setCustomValidity())
注意:novalidate 属性在 IE 下虽不生效,但可通过 event.preventDefault() 在 submit 事件中手动阻止默认提交,等效于开启手动控制。
为什么不要用 html5shiv 或 Modernizr 单独解决?
html5shiv 只解决 IE8 及以下对 HTML5 标签名(如 section)的识别问题,对表单属性和 API 完全无作用;Modernizr 仅做特性检测,不提供 polyfill 实现——它能告诉你 input.required 是 false,但不会帮你加上这个功能。
真正起作用的是运行时修补 DOM 接口的 polyfill 库(如 webshim),或你自己写的 submit 拦截逻辑。检测只是第一步,补全是必须动作。
别指望 IE 自动“理解” HTML5 表单;要么加 polyfill,要么手写 submit 校验——没中间路线。最容易被忽略的是:即使加了 webshim,也要确认它在 DOM ready 后执行,否则动态插入的表单元素不会被自动增强。










