【问题标题】:HTML5 Input Required Validation fails on Submit when javascript sets the value当 javascript 设置值时,HTML5 输入要求验证在提交时失败
【发布时间】:2018-08-12 13:44:43
【问题描述】:

基本上,我有两个输入控件textboxcheckbox。我想要发生的是当单击复选框时,我想设置输入的值。我设置的 javascript 设置了默认值,但是当我提交时,即使文本输入具有值,表单也无法验证所需的输入文本。

 function NoLienHolder() {
            var lh = document.getElementById('vehicleLienHolder');
            if (lh != null) {
                lh.value = "NONE";
            }
        }
<input name="vehicleLienHolder" id="vehicleLienHolder" required="required" placeholder="Enter Lien Holder" oninvalid="this.setCustomValidity('Please enter the Lien Holder or select no lien holder.')"
        oninput="this.setCustomValidity('')" /><input type="checkbox" title="No Lien Holder" onclick="NoLienHolder()" name="NoLienHolderCheckBox" id="NoLienHolderCheckBox" />No Lien Holder

【问题讨论】:

    标签: html validation input


    【解决方案1】:

    这是你的代码,

    function NoLienHolder() {
      var lh = document.getElementById('vehicleLienHolder');
      if (lh != null) {
        lh.value = "NONE";
      }
    }
    <form>
      <input name="vehicleLienHolder" id="vehicleLienHolder" required="required" placeholder="Enter Lien Holder" oninvalid="this.setCustomValidity('Please enter the Lien Holder or select no lien holder.')" oninput="this.setCustomValidity('')" />
      <input type="checkbox" title="No Lien Holder" onclick="NoLienHolder()" name="NoLienHolderCheckBox" id="NoLienHolderCheckBox" />No Lien Holder
      <input type="submit" value="Submit">
    </form>
    当我运行它时,我无法重现问题(它正常通过验证),但我可以看到一些问题。我已经修改了您的代码以产生我认为可能是更好的解决方案。

    var original = "";
    function NoLienHolder() {
      var lh = document.getElementById('vehicleLienHolder');
      var checkbox = document.getElementById("NoLienHolderCheckBox");
      if (checkbox.checked) {
        original = lh.value;
        document.getElementById('status').innerHTML = "Uncheck it to restore its original value";
        lh.value = "NONE";
        lh.setAttribute("disabled", "disabled");
        lh.removeAttribute("required");
      } else {
        lh.value = original;
        document.getElementById('status').innerHTML = "Check the Checkbox if there is no holder";
        lh.setAttribute("required", "required");
        lh.removeAttribute("disabled");
      }
    }
    <form>
      <input name="vehicleLienHolder" id="vehicleLienHolder" required="required" placeholder="Enter Lien Holder" oninvalid="this.setCustomValidity('Please enter the Lien Holder or select no lien holder.')" oninput="this.setCustomValidity('')" /> <input type="checkbox"
        title="No Lien Holder" onclick="NoLienHolder()" name="NoLienHolderCheckBox" id="NoLienHolderCheckBox" />No Lien Holder
      <input type="submit" value="Submit">
      <span id="status">Check the Checkbox if there is no holder</span>
    </form>

    如果你运行它,手动填写输入字段,然后提交,它会像往常一样工作。如果不填写也不勾选,required 验证仍然会生效。如果你不填写并勾选框,文本将变为“NONE”,如果问题再次出现,那么它仍然会提交,后端可以处理。

    在您的原始答案中,您在将输入字段设置为 NONE 之前检查了输入字段是否为空,但是如果用户填写了一些内容,然后选中了复选框,会发生什么情况?它会提交,但不是得到 NONE,而是得到用户的输入,尽管复选框被选中。所以最好的方法可能是保存用户值,并在取消选中时恢复它。

    首先,您可能想要检查用户是否单击了复选框以选中或取消选中它,因为您的脚本会将其文本字段设置为“NONE”,即使用户选中了复选框,更改了他的请注意,更改文本,然后单击以取消选中。此外, lh != null 将不起作用,因为 lh 是元素,而不是它的值。您需要访问其 value 属性。此外,您可能需要考虑从元素中删除所需的属性,将其设置为空,并在用户检查时禁用它。如果用户在字段中手动输入“NONE”但未选中输入框,这可以防止出现任何问题。毕竟,您的请求也会发送复选框的状态。

    【讨论】:

    • 为什么不使用 jquery?这将使这变得容易得多。我不知道你为什么会有这个问题。如果确实有必要,我想您可以删除该元素,并使用已设置的文本创建一个新元素,但我不是专家,所以我不确定这是否可行。
    • 因为 HTML5 具有对模式的验证,并且出于某种原因需要。为什么我不明白,当我通过 javascript 设置值时,html5 验证失败。
    • 我也没有。我自己也遇到过这种情况。但是 html5 可能有这些属性是有原因的,但在某些情况下你可能没有理由使用它们。您使用 NONE 所做的实际上与不需要该字段相同
    • 不想引起太大的争论,但我正在为特定的用户群定制这个 UI。如果我现在不处理它,他们会打电话给我并告诉我更新这些值(并且经常)。我不想接听这些电话。
    • 暂时删除所需的属性并不重要,只要您在用户取消选中该框并在不需要时禁用它时重新添加它即可。这意味着用户只要不勾选就可以正常编辑字段,如果不勾选不填写,required属性仍然会生效并阻止提交。如果他们这样做了,它将保持 NONE。
    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多