假设您有一个表单,其中包含 10 个必填字段。这比互联网上普通表单要大一些,对用户来说也是一项不小的工作。您可能会在此过程中失去一些用户,这绝非好事。也许为了鼓励用户完成表单,您可以让他们知道离完成还有多远,并在过程中显示激励信息。

1. 必填输入的 HTML
对于此演示,输入不一定需要是 required
,但这使得演示更简洁。填写可选字段不会使您更接近提交表单的最低要求。因此,对于此演示,我们将使用 5 个必填字段来创建一个收集付款信息的典型表单。
<form id="payment-form" action="#">
<label for="name">Full Name</label>
<input required id="name" name="name">
<!-- etc -->
</form>
2. 进度条的 HTML
有一个 HTML 元素专门用于可视化显示进度。确切地说,是 <progress>
。让我们准备一个这样的元素(带有 ID,以便 JavaScript 能够轻松地定位它)。将其放置在您想要的位置。
<progress max="100" value="0" id="progress"></progress>
将 max
属性设置为 100 可以简化计算。进度条的填充程度与其值的百分比相同。例如,value="20"
== 进度条填充了 20%。

3. 监视变化
我们将在这里使用 jQuery 来简化事件绑定和元素选择。我们这里的所有输入都将是文本类型的,因此键盘事件相关。所以……
$("#payment-form input").keyup(function() {
// calculate progress
});
4. 统计有效输入的数量
任何特定输入在其当前状态下是否有效,现在都是 DOM 的一部分。一旦我们获得了指向它的指针,我们只需检查 this.validity.valid
是否为真或假。
var numValid = 0;
$("#payment-form input[required]").each(function() {
if (this.validity.valid) {
numValid++;
}
});
5. 调整进度条/显示消息
现在我们有了多少个输入有效的整数,我们只需设置一些基本的逻辑来调整进度条的当前值。
在这里,我们还可以显示激励信息。也许页面上的某个位置有一个 <p>
元素,我们有一个指向它的指针(progressMessage),我们只需调整其中的文本以匹配进度。
// "Cached" somewhere once
var progress = $("#progress"),
progressMessage = $("#progressMessage");
// Logic that runs after counting every time
if (numValid == 0) {
progress.attr("value", "0");
progressMessage.text("The form, it wants you.");
}
if (numValid == 1) {
progress.attr("value", "20");
progressMessage.text("There you go, great start!");
}
浏览器支持
如果浏览器支持是一个问题,您可能需要首先运行一个小的 Modernizr 测试。如果通过,则加载脚本、注入元素,或者您想如何处理它。
if (Modernizr.input.required) {
// Modernizr.load, inject elements, whatever.
}
如果您需要更多帮助,请 阅读这篇文章。
CodePen 上的演示
您可以随意 使用它。
这是一个很棒的想法!喜欢这个概念,尤其是动态进度条!我们将使用它。谢谢!!
我不知道
this.validity.valid
,非常方便。文章也很好!按下按键不是更改输入字段的唯一方法。例如,您还可以使用拖放或在某些 Linux 发行版中使用鼠标中键粘贴来实现。
Hallo,说得很有道理。
我会将触发事件更改为 focus/blur 或其他内容。
除此之外,我非常喜欢这个想法!
自动填充也会造成混乱。但在解决了这些问题后,这是一个很棒的概念。
这是一个渐进增强的好例子。它确实引出了一个将会被问到的问题:该进度条的可样式化程度如何。
进度条的妙用……我一直都在思考如何用一种易于解释和展示的方式来演示 HTML 进度条……这完全符合要求……感谢您的分享……
您可能应该使用
.on("input")
的“input”事件。请注意,它在 IE9 以下版本(我认为)中不受支持,因此您可以同时使用两者(.on("input keyup")
)。此外,在 Windows(至少 Windows 7)上,进度条会不断动画,因此自定义进度条或<meter>
元素(据我所知,在浏览器中具有“自定义”样式)可能会更好……我认为不用说,IE9 讨厌这个。
不错。如果能为进度条添加动画效果就更酷了。类似这样
http://jsfiddle.net/526hM/
不过这不是我的代码;来自 这个 SO 线程,来自一位名为“Thomas”的人。
我不知道 HTML 中有
<progress>
元素。我很惊讶您在‘加载’页面时看不到这个元素。如果有人能向我解释一下在这个演示中表单的验证是在哪里处理的,我将不胜感激,谢谢。
它在 HTML 中,使用“pattern”属性。我相信 JS 也检查空/已填充的输入,以使进度条和消息继续进行。
“pattern”属性是 HTML5 中的新属性,允许在客户端进行验证,而无需额外的 JavaScript。
明白了。谢谢。我需要学习所有新的 HTML5 表单元素。
只需注意 Safari 5(以及 Mobile Safari 5)。它会积极地删除进度元素,而不是仅仅忽略它们。您可能需要先测试进度元素是否存在。
不错,谢谢!
手动设置百分比很麻烦。
如何添加像“valid”这样的类来表示有效,并将进度条的宽度更改为(输入数量)/(有效输入数量)?
由于许多表单都带有 JS 客户端验证,我建议仅在所需值已验证(且有效)后更新进度。此外,如 Louis 所述,使用动画函数将是一个不错的补充。
自动填充可以通过页面加载后另一个事件处理程序来解决,该处理程序将遍历字段并验证它们(并且由于我们的进度更新已挂钩到验证,因此进度将立即更新到相应的值)。