使用HTML表单字段验证

时间:2015-12-30 18:08:44

标签: javascript jquery html forms validation

我正在使用jQuery Mobile并尝试使用HTML5表单字段验证来执行内联表单字段验证。我这样做是因为我非常喜欢浏览器在泡沫中报告问题的方式,而且我不认为等到有人填写完表格然后告诉他们出了什么问题,这是非常用户友好的。这是我的HTML:

<form id="frmMain" action="#">
    <input type="checkbox" data-enhance="false" value="1" id="cbxFB" />
    <label for="cbxFB">
        <span class="formsubtext">Check this box to use Facebook information to help fill out this registration.  Once registered you will be able to use the Facebook login button.</span>
    </label>

    <label for="tbEmail">*Email</label><input type="email" id="tbEmail" required autofocus placeholder="example@address.com" />
    <label for="tbPassword">*Password</label><input type="password" id="tbPassword" required />
    <div class="formsubtext" style="margin-top:1px; padding-top:0px; margin-bottom:10px">Minimum of 6 characters, one capital character, and one lower case character.</div>
    <label for="tbPasswordConfirm">*Password Confirm</label><input type="password" id="tbPasswordConfirm" required />

    <label for="tbPin">*Account Pin</label><input type="password" pattern="[0-9]{4}" id="tbPin" required placeholder="####" />
    <div class="formsubtext" style="margin-top:1px; padding-top:0px; margin-bottom:10px">A four digit number that you will remember.  This value will be needed to perform sensitive tasks within the application.</div>

    <label for="tbFName">*First Name</label><input type="text" id="tbFName" required />
    <label for="tbLName">*Last Name</label><input type="text" id="tbLName" required />
    <label for="tbPhone">Phone Number</label><input type="tel" id="tbPhone" pattern="\d{3}[\-]\d{3}[\-]\d{4}" placeholder="###-###-####" style="margin-bottom:1px; padding-bottom:0px;" />
    <div class="formsubtext" style="margin-top:1px; padding-top:0px; margin-bottom:20px;">Used at your option when you schedule an appointment with a service provider</div>

    <div style="display:none;"><label for="tbfbID">Facebook ID</label><input type="text" id="tbfbID" /></div>

    <input type="submit" id="btnMainNext" data-icon="arrow-r" data-iconpos="right" value="Next" data-theme="c" class="ui-btn-c ui-btn ui-corner-all" />
</form>

对于确认密码表单字段,我定义了以下事件:

$("#tbPasswordConfirm").on("change", function (event) {
  var password = $("#tbPassword").val();
  var passwordconfirm = $("#tbPasswordConfirm").val();

  if (password != passwordconfirm) {
    $("#tbPasswordConfirm")[0].setCustomValidity("The value entered does not match the previous password entered.");
    $("#btnMainNext").click();
  }
  else {
    $("#tbPasswordConfirm")[0].setCustomValidity("");
  }
  $(this).focus().select();
})

我的问题是,当用户在字段中输入内容并移动到下一个字段时,HTML表单验证会显示下一个字段的错误消息(这是必需的)。我希望它显示他们刚刚离开的字段的消息。如何停止焦点移动到下一个字段,以便显示的气泡消息来自他们刚刚输入数据的字段?正如您所看到的,我已尝试设置焦点,但这不起作用。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可以使用html tabindex attr来操作当您单击制表符时哪个元素将获得焦点。请参阅docs以了解如何使用它。

例如,如果您将密码确认输入为tabindex="5",则可以将tabindex="6"添加到<label for="tbPin">元素,以防止下一个输入立即聚焦。

答案 1 :(得分:0)

解决了它

Fiddle

$(function() {
  $("#tbPasswordConfirm").on("input", function(event) {
    var thisField = $("#tbPasswordConfirm")[0],
      theForm = $("#frmMain")[0],
      password = $("#tbPassword").val(),
      passwordconfirm = $(this).val(),
      custom = password === passwordconfirm ? "" : "The value entered does not match the previous password entered.";
    thisField.setCustomValidity(custom);
    if (!theForm.checkValidity()) theForm.reportValidity();
  });
});

答案 2 :(得分:0)

您可以停止焦点移动到下一个字段,但除非单击“提交”按钮,否则无法触发本机验证UI或错误消息。

要停止焦点移动下一个字段,在字段上设置自定义有效性后,您可以使用:

$('#tbPasswordConfirm').blur(function(event) {
    event.target.checkValidity();
}).bind('invalid', function(event) {
    setTimeout(function() { $(event.target).focus();}, 50);
});

blur()函数将检查模糊的有效性,如果它无效,bind()中的相应函数会将焦点设置回该元素。