首先我是webshims库的创作者(一个不再维护的polyfill)。回答你的问题:
为一个项目创建表单 polyfill 值得吗?
不值得,仅为了一个项目这样做真的很难。嗯,我已经做过了,只是因为我想使用现代技术。
像 webshims 库这样的表单 polyfill 值得在项目中使用吗?
绝对值得!这里是原因:
1. 美好的标准化声明式 Markup API
在引入 webshims 并编写以下脚本后:
//polyfill forms (constraint validation) and forms-ext (date, range etc.)
$.webshims.polyfill('forms forms-ext');
您可以将您的小部件和限制条件简单地编写进您的表单中:
<input type="date" />
<input type="date" min="2012-10-11" max="2111-01-01" />
<input type="range" disabled />
<input type="email" required placeholder="Yo you can use a placeholder" />
这将创建3个不同的小部件,并且每个小部件都有不同的配置。无需额外的JS,只需要标准化、干净和精简的代码。
2. 标准化的DOM API
DOM API也是如此。以下仅是两个示例:组合两个日期字段 和 将范围字段与日期字段组合。
3. 现代浏览器中无需JS即可运行
在旧浏览器中可以优雅地降级,并在现代浏览器中表现良好。
4. 现代浏览器中文件大小更小
特别适用于移动设备(例如iOS 5、黑莓支持日期等)。
5. 更好的用户体验(主要是移动设备)
更好的移动用户体验(更好的触摸输入UI、更好的性能、适应系统),如果您使用它:type="email"、type="number"和type="date"/type="range"
但是,定制化怎么办?
我在一家大型机构中担任开发人员,您完全正确,大多数客户和设计师都不会容忍太多差异,但我仍然想使用现代技术,这意味着Webshims库可以为您提供最好的两个世界。
自定义约束验证
填充部分
//polyfill constraint validation
$.webshims.polyfill('forms');
自定义错误气泡的用户界面:
$(function(){
$('form').bind('firstinvalid', function(e){
$.webshims.validityAlert.showFor( e.target );
return false;
});
});
生成以下标记:
<!
<span class="validity-alert-wrapper" role="alert">
<span class="validity-alert">
<span class="va-arrow"><span class="va-arrow-box"></span></span>
<span class="va-box">Error message of the current field</span>
</span>
</span>
自定义无效/有效表单字段的样式:
.form-ui-invalid {
border-color: red;
}
.form-ui-valid {
border-color: green;
}
自定义有效性提示信息的文本:
<input required data-errormessage="Hey this is required!!!" />
现在的焦点是什么:
- 即使没有JS也可以使用
- 现代浏览器只加载自定义代码(3kb min/gzipped),旧版浏览器会加载额外的API(约13kb min/gzip)(表单包含的不仅仅是约束验证API,还有自动对焦、占位符、输出等等)
那么你的特殊示例,自定义日期字段呢?
没问题:
//configure webshims to use customizable widget UI in all browsers
$.webshims.setOptions('forms-ext', {
replaceUI: true
});
$.webshims.polyfill('forms forms-ext');
还有这里:
- 在现代浏览器中仍然可以在没有JS的情况下工作。
- 现代浏览器仅加载UI和UI-API粘合剂,但不加载DOM-API(valueAsNumber,valueAsDate…)。
现在,这里是最好的部分:
$.webshims.setOptions('forms-ext', {
replaceUI: !(/mobile|ipad|iphone|fennec|android/i.test(navigator.userAgent))
});
$.webshims.polyfill('forms forms-ext');
- 减小文件大小并为移动浏览器提供更好的用户体验(大多数客户和设计师都会因为在移动端有不同的UI而喜欢你!)
- 在现代浏览器中即使没有JS仍然可以使用
- 现代浏览器只加载UI和UI-API的接口,但不加载DOM-API(如valueAsNumber、valueAsDate等)