先决条件
- 我有一个用于重复或关闭问题的 searched
- 我有 validated 的任何HTML以避免常见问题
- 我阅读了 contributing guidelines
描述问题
以 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>
简化的测试用例
您在哪个操作系统上看到问题?
macOS
您在哪个浏览器上看到问题?
Chrome
您使用的Bootstrap版本是什么?
最新
8条答案
按热度按时间sczxawaw1#
你好@BoPeng!
感谢你提出这个问题 :)
在我的情况下,这些值是从后端返回的无效用户输入的一部分,等待修订,所以我认为这是一个有效的用例。
抱歉,但我不确定是否完全理解这个用例。你是说例如你有一个空表单,然后这个表单会被(预)自动填充一些后端数据吗?
如果是这种情况,在你的CodePen中,你应该让
.needs-validation
消失并删除.was-validated
,因为表单还没有提交。如果你的用例更多地是关于服务器端验证,你应该使用这个示例。
vsmadaxz2#
在我的情况下,表单最初是
.needs-validation
,用户填写一些数据并提交到服务器。服务器处理数据,返回的表单中.need-validation
被.was-validated
替换,并附带额外的错误信息。因此,返回的表单有以下内容:
.was-validated
在form
input
,包含用户输入的数据.invalid-feedback
来自服务器。第二点是示例中唯一的附加内容。由于文档没有提到
value
在input
中的作用,所以令我感到惊讶的是input
会被标记为绿色,如果服务器将字段.is-invalid
(绿色输入 + 红色错误信息)标记为绿色,情况会更奇怪。正如您指出的那样,解决方案是避免使用
.was-validated
,坚持使用字段级别的.is-valid
和.is-invalid
。这对我来说相当麻烦,因为可能有很多字段,而is-valid
和is-invalid
可以明显地从.invalid-feedback
的存在中推导出来(就像.was-validated
的情况一样)。s4n0splo3#
同样的问题
ccrfmcuu4#
@BoPeng
您的问题是不应该在服务器端验证中使用
was-validated
。这会触发将:valid
和:invalid
CSS伪类应用于表单控件,而这些控件的样式会覆盖.is-invalid
样式。相反,您应该只将
is-invalid
和is-valid
类名应用于表单控件。l3zydbqr5#
感谢您的澄清。我认为文档可以更新以澄清
.was-validated
的使用。特别是,它们不需要一个 .was-validated 父类。
可以更新为
它们不应该与
.was-validated
父类一起使用qc6wkl3g6#
我认为当表单有
.was-validated
时,.is-invalid
在输入组件上覆盖样式是有意义的。我不确定为什么文本框会有.is-invalid
,如果开发人员的意思是让它有效的话。在表单验证后,是否有其他方法可以手动将输入字段标记为无效?
hec6srdp7#
我们今天也遇到了这个问题。我们尽量使用浏览器自带的验证功能。然而,在一些情况下,我们无法避免使用自定义验证。因此,我们需要在表单元素中添加
was-validated
类以支持浏览器自带的验证功能,并在具有自定义验证的字段上添加is-invalid
类。我们正在使用带有
react-hook-form
的 react,这使得使用 setCustomValidity 变得困难。如果有一个仅使用 css 支持:is-invalid
伪类和同一表单中的is-invalid
类的解决方案,那将是非常棒的。kognpnkq8#
解决方法:
在所有bootstrap导入之后,将以下代码添加到自己的SCSS文件中: