css 我如何使用JavaScript表单验证与自定义而不是伪类的有效状态?

vybvopom  于 2023-06-25  发布在  Java
关注(0)|答案(1)|浏览(176)

我希望能够精确控制何时使用vanilla js通过CSS向用户显示有效性状态。我选择分配自定义类而不是样式化input:invalid和input:valid,但是我提出的解决方案不起作用。我对表单不熟悉,可能我的整个解决方案逻辑都有缺陷,但除了分配类之外,其他一切似乎都在工作(设置和报告CustomValidity)。
我做了这个CodePen来演示我的问题:https://codepen.io/kmekmekme/pen/qBQNggb

const firstName = document.querySelector("#first-name");
    firstName.addEventListener("input", (e) => {
        firstName.setCustomValidity("");
        var val = firstName.validity.valid;
        firstName.classList.remove("valid");
        firstName.classList.remove("invalid");
        if (val == false) {
            if (firstName.validity.tooShort) {
                firstName.setCustomValidity("First name must be 2 letters or longer.");
                setTimeout(() => {
                    firstName.reportValidity();
                    firstName.classList.add("invalid"); }, 900); }
            else if (firstName.validity.patternMismatch) {
                firstName.setCustomValidity("First name can only contain letters");
                setTimeout(() => {
                    firstName.reportValidity();
                    firstName.classList.add("invalid"); }, 900); } }
        else if (val==true) {
            firstName.classList.add("valid");
            firstName.setCustomValidity(""); } })

我很抱歉,如果这个问题可能是具体的或没有帮助其他用户,但我不能弄清楚我自己与谷歌。
在这个例子中,我尝试在每次用户输入时删除两个类,但我也尝试在每次分配一个类时删除另一个类(例如。“); document. writeln(“document. writeln”); invalid();另一个解决方案似乎比第一个更好,但它仍然是错误的。我试图实现对错误输入的实时响应,因此使用“更改”事件不会产生我想要的结果。
编辑:当我只是删除我设置的超时时,函数似乎工作得很好。我需要一种方法,使我的报告仍然工作的真实的,但没有输入字段变成红色,只要你开始打字(因为你最初需要只有一个字母)。有没有办法做到这一点?

nc1teljy

nc1teljy1#

代码的问题是在更新有效性状态之前触发了输入事件。因此,当您检查firstName.validity.valid时,它仍然具有以前的值。这就是为什么课堂作业没有像预期的那样工作。要解决这个问题,可以使用change事件而不是input来更新有效性状态并分配类。在有效性状态已被更新之后触发改变事件。下面是使用change事件的代码的更新版本:

const firstName = document.querySelector("#first-name");
firstName.addEventListener("change", (e) => {
  firstName.setCustomValidity("");
  firstName.classList.remove("valid");
  firstName.classList.remove("invalid");
  
  if (!firstName.checkValidity()) {
    if (firstName.validity.tooShort) {
      firstName.setCustomValidity("First name must be 2 letters or longer.");
    } else if (firstName.validity.patternMismatch) {
      firstName.setCustomValidity("First name can only contain letters");
    }
    
    setTimeout(() => {
      firstName.report

在这段代码中,使用了change事件而不是input。调用checkValidity()方法来更新有效性状态,然后根据有效性状态分配类。我还删除了不必要的检查,如瓦尔== false和val == true,因为checkValidity()已经返回了一个布尔值。通过这些更改,应该根据输入字段的有效性状态正确地分配类。

相关问题