HTML5 form Field polyfill
为了解放开发者,HTML5引入了约束验证的概念,一种本地实现的网页表单验证。尽管所有主流浏览器的最新版本都支持了这个特性,但一些浏览器尚未实现。这个项目的主要功能就是让所有浏览器均支持HTML5表单约束验证功能,同时提供placeholder属性和oninput事件等相关功能。
<script src="build/h5form.js"></script>
加入js后,为Firefox和Chrome等现代浏览器而写的表单验证,IE下也能工作了
h5form.js
会自动管理依赖的js,IE9+会自动加载h5form.el.js
,IE6-8下自动加载h5form.htc
,IE6+、Safari下将会加载placeholder.js
jQuery(function($){
// 延迟0毫秒,以便等待IE下的HTML5表单验证shim加载、此案例下不需这么做
setTimeout(function(){
$("form").submit(function(e){
// 数据提交
e.preventDefault();
// $.ajax(......);
}).on("click", ":submit", function(e){
// 按“提交”按钮时检查表单
if(!e.target.form.checkValidity()){
// 表单发生错误时,阻止click事件默认行为
e.preventDefault();
}
}).on("invalid", function(e){
// 表单在发生错误汇报事件时,在表单元素添加错误态样式
$(e.target).addClass("ui-error");
}).on("input", function(e){
// 用户在表单中输入字符时,检查表单正确性
if(e.target.validity.valid){
// 若表单内容已然正确,去掉错误态样式
$(e.target).addClass("ui-error");
}
});
}, 0);
});
支持的浏览器
- IE6+ (兼容IE11)
- Chrome
- Firefox
- Safari
- Opera (老版本Presto内核也支持)
支持的HTML5属性
属性 | 调用形式 | 说明 |
---|---|---|
noValidate | form.noValidate |
不验证此表单 |
formNoValidate | button.formNoValidate |
此按钮所属表单不验证 |
validationMessage | field.validationMessage |
错误消息 |
willValidate | field.willValidate |
此元素可进行验证 |
placeholder | field.placeholder |
文本框占位字符 |
required | field.required |
此项为必填项 |
pattern | field.pattern |
正则验证规则 |
step | field.step |
数字增量 |
max | field.max |
数字上限 |
min | field.min |
数字下限 |
validity | field.validity |
约束验证的详细信息 |
validity.customError |
自定义错误 | |
validity.patternMismatch |
正则不匹配 | |
validity.rangeOverflow |
值max越界 | |
validity.rangeUnderflow |
值min越界 | |
validity.stepMismatch |
值不符setp | |
validity.tooLong |
文本超长 | |
validity.typeMismatch |
值不符type约束 | |
validity.valid |
验证无误 | |
validity.valueMissing |
值为空 |
支持的HTML5方法
- checkValidity()
form.checkValidity()
、field.checkValidity()
检查表单,返回布尔值,且在错误时触发oninvalid - setCustomValidity()
field.setCustomValidity(msg)
设置自定义错误
支持的HTML5表单事件 (IE6-8下需加载jQuery,否则不支持)
- oninvalid 表单验证失败事件
- oninput 表单值改变事件
特性详解
- 已经支持HTML5表单约束验证的浏览器下,加载文件后会隐藏掉浏览器原生的气泡提示
- 修正Safari下invalid事件后表单依然被提交的问题
- 修正了已支持placeholder功能的各浏览器,统一为焦点态时显示提示文字,统一为textarea标签提示文字可换行
- 当与jQuery共同使用时:
- oninvalid事件向DOM树冒泡(原生oninvalid事件并不冒泡)
- 让jquery支持“:invalid”和“:valid”伪类选择符
- 对IE低版本添加的功能:
- 添加IE6-9对placeholder功能的支持
- 添加IE6-8对oninput事件的支持
- 添加IE6-9对约束验证功能的支持
- 对高版本IE的已有的不完善功能的修正
- 修正IE10+支持HTML5约束验证,但很多细节与其他浏览器有差异的问题
- 修正IE10+对placeholder的实现与其他浏览器的差异 (文本框获取焦点但未输入文字时,应该显示占位文本。)
- 修正IE9+高版本对可编辑状态元素(如:
<p contentEditable="true">;
)不支持oninput事件的问题 - 修正IE9在删除、剪切等方式操作文本框中的字符串时,不触发oninput事件的问题 (该死的IE9不再支持onpropertychange事件)
::-webkit-input-placeholder {
color: green;
}
:-ms-input-placeholder {
color: green;
}
::-moz-placeholder {
color: green;
opacity: 1;
}
placeholder {
color: green;
}
这里以文本框焦点时,不显示placeholder为例
:focus::-webkit-input-placeholder {
color: transparent;
}
:focus:-ms-input-placeholder {
color: transparent;
}
:focus::-moz-placeholder {
color: transparent;
}
:focus+placeholder {
color: transparent;
}
- 本项目使用grunt编译,提交代码需经过grunt做JSHint代码风格检查和QUnit单元测试
- grunt运行后doc目录将生成YUIDoc文档