bootstrap 输入值显示为有效,已验证,无效和无效反馈,

wgx48brx  于 4个月前  发布在  Bootstrap
关注(0)|答案(8)|浏览(145)

先决条件

描述问题

this example from documentation 为例子,但将 needs-validation 更改为 was-validated。表单按预期工作,但是

  • 如果我在 input 中添加 City ,城市将显示为有效,而 invalid-feedback 不会显示。
  • 如果我在 Zip 中添加 value="00000".is-invalid ,邮政编码文本框显示为有效,尽管现在 invalid-feedback 以红色显示。

在我的情况下,值是从后端返回的无效用户输入的一部分,等待修订,因此我认为这是一个有效的用例。

<form class="row g-3 needs-validation" novalidate>
  <div class="col-md-4">
    <label for="validationCustom01" class="form-label">First name</label>
    <input type="text" class="form-control" id="validationCustom01" value="Mark" required>
    <div class="valid-feedback">
      Looks good!
    </div>
  </div>
  <div class="col-md-4">
    <label for="validationCustom02" class="form-label">Last name</label>
    <input type="text" class="form-control" id="validationCustom02" value="Otto" required>
    <div class="valid-feedback">
      Looks good!
    </div>
  </div>
  <div class="col-md-4">
    <label for="validationCustomUsername" class="form-label">Username</label>
    <div class="input-group has-validation">
      <span class="input-group-text" id="inputGroupPrepend">@</span>
      <input type="text" class="form-control" id="validationCustomUsername" aria-describedby="inputGroupPrepend" required>
      <div class="invalid-feedback">
        Please choose a username.
      </div>
    </div>
  </div>
  <div class="col-md-6">
    <label for="validationCustom03" class="form-label">City</label>
    <input type="text" class="form-control" id="validationCustom03" required>
    <div class="invalid-feedback">
      Please provide a valid city.
    </div>
  </div>
  <div class="col-md-3">
    <label for="validationCustom04" class="form-label">State</label>
    <select class="form-select" id="validationCustom04" required>
      <option selected disabled value="">Choose...</option>
      <option>...</option>
    </select>
    <div class="invalid-feedback">
      Please select a valid state.
    </div>
  </div>
  <div class="col-md-3">
    <label for="validationCustom05" class="form-label">Zip</label>
    <input type="text" value="00000" class="form-control is-invalid" id="validationCustom05" required>
    <div class="invalid-feedback">
      Please provide a valid zip.
    </div>
  </div>
  <div class="col-12">
    <div class="form-check">
      <input class="form-check-input" type="checkbox" value="" id="invalidCheck" required>
      <label class="form-check-label" for="invalidCheck">
        Agree to terms and conditions
      </label>
      <div class="invalid-feedback">
        You must agree before submitting.
      </div>
    </div>
  </div>
  <div class="col-12">
    <button class="btn btn-primary" type="submit">Submit form</button>
  </div>
</form>

简化的测试用例

codepen

您在哪个操作系统上看到问题?

macOS

您在哪个浏览器上看到问题?

Chrome

您使用的Bootstrap版本是什么?

最新

sczxawaw

sczxawaw1#

你好@BoPeng!
感谢你提出这个问题 :)
在我的情况下,这些值是从后端返回的无效用户输入的一部分,等待修订,所以我认为这是一个有效的用例。
抱歉,但我不确定是否完全理解这个用例。你是说例如你有一个空表单,然后这个表单会被(预)自动填充一些后端数据吗?
如果是这种情况,在你的CodePen中,你应该让.needs-validation消失并删除.was-validated,因为表单还没有提交。
如果你的用例更多地是关于服务器端验证,你应该使用这个示例。

vsmadaxz

vsmadaxz2#

在我的情况下,表单最初是 .needs-validation ,用户填写一些数据并提交到服务器。服务器处理数据,返回的表单中 .need-validation.was-validated 替换,并附带额外的错误信息。
因此,返回的表单有以下内容:

  1. .was-validatedform
  2. 非空的 input,包含用户输入的数据
  3. .invalid-feedback 来自服务器。
    第二点是示例中唯一的附加内容。由于文档没有提到 valueinput 中的作用,所以令我感到惊讶的是 input 会被标记为绿色,如果服务器将字段 .is-invalid (绿色输入 + 红色错误信息)标记为绿色,情况会更奇怪。
    正如您指出的那样,解决方案是避免使用 .was-validated ,坚持使用字段级别的 .is-valid.is-invalid 。这对我来说相当麻烦,因为可能有很多字段,而 is-validis-invalid 可以明显地从 .invalid-feedback 的存在中推导出来(就像 .was-validated 的情况一样)。
ccrfmcuu

ccrfmcuu4#

@BoPeng
您的问题是不应该在服务器端验证中使用 was-validated。这会触发将 :valid:invalid CSS伪类应用于表单控件,而这些控件的样式会覆盖 .is-invalid 样式。
相反,您应该只将 is-invalidis-valid 类名应用于表单控件。

l3zydbqr

l3zydbqr5#

感谢您的澄清。我认为文档可以更新以澄清 .was-validated 的使用。特别是,
它们不需要一个 .was-validated 父类。
可以更新为
它们不应该与 .was-validated 父类一起使用

qc6wkl3g

qc6wkl3g6#

我认为当表单有 .was-validated 时,.is-invalid 在输入组件上覆盖样式是有意义的。我不确定为什么文本框会有 .is-invalid,如果开发人员的意思是让它有效的话。
在表单验证后,是否有其他方法可以手动将输入字段标记为无效?

hec6srdp

hec6srdp7#

我们今天也遇到了这个问题。我们尽量使用浏览器自带的验证功能。然而,在一些情况下,我们无法避免使用自定义验证。因此,我们需要在表单元素中添加 was-validated 类以支持浏览器自带的验证功能,并在具有自定义验证的字段上添加 is-invalid 类。
我们正在使用带有 react-hook-form 的 react,这使得使用 setCustomValidity 变得困难。如果有一个仅使用 css 支持 :is-invalid 伪类和同一表单中的 is-invalid 类的解决方案,那将是非常棒的。

kognpnkq

kognpnkq8#

解决方法:
在所有bootstrap导入之后,将以下代码添加到自己的SCSS文件中:

.was-validated .is-invalid:valid {
  border-color: $form-feedback-invalid-color;
  background-image: escape-svg($form-feedback-icon-invalid);
}
.was-validated .is-invalid:valid:focus {
  border-color: $form-feedback-invalid-color;
  box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($form-feedback-invalid-color, $input-btn-focus-color-opacity)
}
.was-validated .form-select.is-invalid:valid {
  background-image: escape-svg($form-select-indicator), escape-svg($form-feedback-icon-invalid) !important;
}

相关问题