【问题标题】:Am I doing things properly on this validation function?我在这个验证功能上做得正确吗?
【发布时间】:2020-10-18 23:22:09
【问题描述】:

我想知道这个电子邮件验证功能是否正确制作,或者可以以不同的方式完成。另外我想知道如何在不中断转换的情况下删除错误内容,我尝试使用innerHTML = "",但转换停止工作。提前致谢。

const email = document.querySelector('#email');

eventListeners();

function eventListeners() {
  email.addEventListener('keyup', validateEmail);
}

function validateEmail() {

  const email = document.querySelector('.email'),
    error = document.querySelector('.error'),
    inputEmail = document.querySelector('#email'),
    formatEmail = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

  if (inputEmail.value.match(formatEmail)) {
    error.classList.remove("show");
  } else {
    if (inputEmail.value !== "") {
      error.innerHTML = `<p>error</p>`;
      error.classList.add("show")
    } else {
      error.classList.remove("show");
    }
  }
}
.error {
  width: 200px;
  max-height: 0;
  transition: max-height 1s ease-out;
  overflow: hidden;
  background: #d5d5d5;
  text-align: center;
}

.show {
  max-height: 100px;
  transition: max-height 1s ease-in;
}
<div class="name">
  <label for="name">Name:</label>
  <input type="text" id="name" name="name" placeholder="Name">
</div>
<div class="email">
  <label for="email">Email:</label>
  <input type="email" id="email" name="email" placeholder="Email">
  <div class="error"></div>
</div>
<div class="password">
  <label for="password">Password:</label>
  <input type="password" id="password" name="password" placeholder="Password">
</div>

【问题讨论】:

    标签: javascript css validation css-transitions addeventlistener


    【解决方案1】:

    我觉得没问题,有几点:

    1. inputchange 事件更适合监听输入。如果您想对输入的每一次更改做出反应,请使用input,例如击键,或从浏览器保存的电子邮件地址列表中选择电子邮件。如果您只希望处理程序在用户提交更改时运行,请使用 change,例如由于失去焦点。
    2. 要在隐藏时为错误元素设置动画,您需要监听transitionend 事件,并且仅在该事件触发后删除内容。这使动画有时间完成。否则,框将立即折叠,并且没有任何动画。

    const email = document.querySelector('#email');
    
    eventListeners();
    
    function eventListeners() {
      email.addEventListener('input', validateEmail);
    }
    
    function validateEmail() {
    
      const email = document.querySelector('.email'),
        error = document.querySelector('.error'),
        inputEmail = document.querySelector('#email'),
        formatEmail = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    
      if (inputEmail.value.match(formatEmail)) {
        error.classList.remove("show");
      } else {
        if (inputEmail.value !== "") {
          error.innerHTML = `<p>error</p>`;
          error.classList.add("show")
        } else {
          error.addEventListener('transitionend', () => {
            error.innerHTML = '';
          }, {
            once: true
          });
          error.classList.remove("show");
        }
      }
    }
    .error {
      width: 200px;
      max-height: 0;
      transition: max-height 1s linear;
      overflow: hidden;
      background: #d5d5d5;
      text-align: center;
    }
    
    .error.show {
      max-height: 100px;
    }
    <div class="name">
      <label for="name">Name:</label>
      <input type="text" id="name" name="name" placeholder="Name">
    </div>
    <div class="email">
      <label for="email">Email:</label>
      <input type="email" id="email" name="email" placeholder="Email">
      <div class="error"></div>
    </div>
    <div class="password">
      <label for="password">Password:</label>
      <input type="password" id="password" name="password" placeholder="Password">
    </div>

    【讨论】:

    • 我非常感谢你,理查德。这正是我一直在寻找的。非常感谢!
    • 很高兴能够提供帮助。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2012-12-12
    • 2021-01-25
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多