我正在为我的HTML表单创建一个自定义验证,以将maxlength
属性的行为从阻止超过限制的输入更改为非阻止,因此允许用户输入超过指定限制的字符,但会看到一个错误。然而,我无法让它与禁用的字段一起工作。
我在规范(源代码)中读到:
如果某个元素被禁用,它将被禁止进行约束验证。
这似乎适用于具有required
属性的输入,因为当字段为disabled
并且没有值时,validity.valueMissing
为false
。但是当字段设置了maxlength
属性时,当字段为disabled
并且具有比maxlength
更长的值时,validity.tooLong
为true
。
在下面的示例中,当我在输入字段中输入超过10个字符时,单击“Toggle disabled”按钮以禁用该字段,然后单击“Report validity”按钮,当我希望它不显示时(在Chrome和Firefox上选中),错误会显示出来。
const input = document.getElementById("input");
const errMsg = document.getElementById("err-msg");
const btnToggle = document.getElementById("btn-toggle");
const btnReport = document.getElementById("btn-report");
btnToggle.addEventListener("click", () => {
input.disabled = !input.disabled;
});
btnReport.addEventListener("click", () => {
input.maxLength = "10";
if(input.validity.tooLong) {
input.style.border = "red solid 1px";
errMsg.style.display = "block";
} else {
input.style.border = "revert";
errMsg.style.display = "none";
}
input.removeAttribute("maxlength");
});
<input id="input" type="text" value="">
<div id="err-msg" style="color: red; display: none;">Input should have at most 10 characters.</div>
<div>
<button id="btn-toggle">Toggle disabled</button>
<button id="btn-report">Report validity</button>
</div>
我是否缺少了规范中的某些内容?我如何利用内置的验证机制来:
- 不阻止用户在输入字段中输入更多字符,
- 输入的字符数超过允许的字符数时验证失败,
- 输入较短或字段禁用时是否通过验证(无论输入长度如何)?
1条答案
按热度按时间lf3rwulv1#
即使元素的约束验证被禁用,
.validity
属性仍然被设置。来自4.10.20.1定义注
即使当元件被禁用时,元件仍然可以遭受这些状态;因此,即使在提交过程中验证表单不会向用户指示问题,这些状态也可以在DOM中表示。