html - 即使违反 minlength,HTML 输入 checkValidity() 也始终返回 true
问题描述
非常简单的设置:
<input id="Input" type="text" minlength="8" required />
<script>
const input = window.document.getElementById('Input');
input.value = "foobar"
console.log(input.checkValidity());
</script>
以下返回true
应该是false
. 见https://jsbin.com/huqowesewu/edit?html,输出
这到底是为什么?输入的长度为6,小于8,所以应该是无效的。但事实并非如此。这个属性坏了吗?还是checkValidity()
坏了?至少可以说我很困惑。
解决方案
这应该有效。根据 WHATWG,它应该可以工作。根据 caniuse.com 它应该可以工作。
但是,它似乎仅在用户编辑值时才有效,而不是从 JavaScript 设置。我在 WHATWG 或 MDN 上没有找到任何关于这种行为的信息(也许它就在那里,我不知道去哪里找)。
它记录在 WHATWG 上。两者都minlength
需要maxlength
用户交互。更准确地说,当用户修改输入值时,会设置一个“脏值标志”,在验证时会考虑到这一点。请参阅限制用户输入长度:maxlength 属性:
约束验证:如果元素具有最小允许值长度,其脏值标志为真,其值最后由用户编辑更改(与脚本所做的更改相反),其值不是空字符串,并且元素的 API 值的长度小于该元素的最小允许值长度,则表示该元素过短。
我测试过但没有成功的事情:监听"invalid"
事件。触发"input"
事件。在检查之前从input
with中移除焦点。blur()
从queueMicrotask(function)
. 从requestAnimationFrame(function)
. 从 double 检查requestAnimationFrame(function)
。检查一个有效值,然后检查一个无效值。通过 HTML 属性设置有效或非空的无效默认值。setAttribute
使用from JavaScript设置值。设置defaultValue
。
我在 Chromium Edge 和 Firefox 上进行了测试。
我还发现了如何在以编程方式设置字段时触发最小长度验证的问题?这没有提供解决方案。
无论如何,您可以使用pattern
来模拟此验证约束。是的,它会像大多数验证约束一样正确地从 JavaScript 触发。见https://stackoverflow.com/a/10294291/402022
推荐阅读
- python - 从序列化程序中的模型获取自动生成的字段,而不返回它
- ios - 使用未解析的标识符“SDKApplicationDelegate”
- java - 如何反序列化 OpenNLP 训练的模型?
- node.js - 无法在 for 循环中实例化多个对象 - node.js
- angular - 如何使用多选在 primeNg p-table 中的数组内搜索?
- java - 更新精灵图像时出现 ConcurrentModificationException
- python - Django runserver错误,新安装,第一次使用Django
- angularjs - 我如何使用自定义键上传文件
- python - 当我与预测连接时的数据
- python - 通过带有参数的入口点函数启动 docker 容器