如何在表单重置后手动重置IE中的输入验证状态?

时间:2017-10-06 16:53:09

标签: javascript html5 forms internet-explorer html5-validation

在默认表单重置后,似乎Internet Explorer未重置验证状态(.checkValidity()validity.valid)。这在Chrome和Edge中可以正常运行。

有没有人对此问题有任何了解,以及如何解决这个问题 - 也许如何手动重置IE中的验证状态?

我没有看到任何引用此问题的文档 - caniuse声称在IE10和IE11中对HTML5验证的支持有限,但没有具体引用此属性。

请参阅以下示例 - 预期行为:

  • 未选中单选按钮;单击submit = input invalid(由于默认的HTML5控件,表单无效不会触发 - 它永远不会到达处理程序,这没关系)
  • 选中1个单选按钮;点击提交=有效输入,有效表格
  • 点击重置=无效输入,无效表单
    • 这是IE偏离的地方 - 它保留表单和输入仍然有效,即使输入为空。

(function() {
  $("form")
    .on("submit", function(e) {
      var v = formValidCheck();
      if (!v) {
        e.preventDefault();
      }

      radioValidCheck(false);

      return false; // don't go anywhere
    })
    .on("reset", function(e) {
      // Push onto event stack, so it refreshes after the form fields have been reset
      setTimeout(function() {
        $('input').change();
        formValidCheck();
        radioValidCheck(false);
      }, 0);
    });

  $('input').on('invalid', function(e) {
    e.preventDefault();
    radioValidCheck(true);
  });
  $('input').on('change', function(e) {
    formValidCheck();
    radioValidCheck(false);
  });

  function formValidCheck() {
    var v = $('form').get(0).checkValidity();
    $("#test").text(v);

    return v;
  }

  function radioValidCheck(clearFormValid) {
    if (clearFormValid) {
      $('#test').text('');
    }
    $("#testradio").text($("#radio1").get(0).validity.valid);
  }
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>Form is valid? <span id="test"></span></p>
<p>Radio is valid? <span id="testradio"></span></p>

<form>
  <input type="radio" required id="radio1" name="testradios">
  <label for="radio1">1</label>

  <input type="radio" required id="radio2" name="testradios">
  <label for="radio2">2</label>

  <input type="radio" required id="radio3" name="testradios">
  <label for="radio3">3</label>

  <button type="submit">Submit</button>
  <button type="reset">Reset</button>
</form>

我尝试了一些事情,例如触发对输入的更改,并将其推送到事件堆栈,以便在将更改应用到输入后访问它,如代码段中所示,但仍然没有运气。

我没有发现任何错误或在其他地方提及

0 个答案:

没有答案
相关问题