JSFiddle - React, Tailwind, and code Playground

HTML

<h1 style="text-align: center;">JavaScript 系列三:練習4 ── 表單驗證</h1>

<form action="" method="post" id="register-box">
  <label for="username"><span class="must-have">*</span>用戶暱稱</label>
  <input type="text" name="username" id="username" placeholder="用戶暱稱" maxlength="40" required>
  <p class="alert" id="userNameAlert">不能為空白、必須在40字以內</p>

  <label for="email"><span class="must-have">*</span>Email 信箱</label>
  <input type="email" name="email" id="email" placeholder="Email 信箱" required>
  <p class="alert" id="emailAlert">不能為空白、必須包含 @ 符號</p>

  <label for="password"><span class="must-have">*</span>密碼</label>
  <input type="password" name="password" id="password" placeholder="密碼" minlength="8" maxlength="100" required>
  <p class="alert" id="passwordAlert">不能為空白、必須在8字以上、必須在100字以內</p>

  <input type="submit" name="" id="" value="註冊" onclick="check()">
</form>

CSS

* {
  padding: 0;
  margin: 0;
}

#register-box {
  width: 350px;
  padding: 20px;
  margin: 30px auto;
  border: 5px solid rgba(72, 125, 204, 1);
  border-radius: 10px;
  box-sizing: border-box;
}

#register-box label,
#register-box input {
  display: block;
  width: 100%;
  box-sizing: border-box;
}

#register-box label {
  font-size: 16px;
  font-weight: 900;
  color: rgba(72, 125, 204, 1);
}

#register-box label .must-have {
  color: #f00;
  vertical-align: top;
}

#register-box input {
  padding: 5px 10px;
  margin: 5px 0 10px;
  font-size: 14px;
  border-width: 2px;
  border-radius: 5px;
  border-style: solid;
  outline: none;
}

#register-box p.alert {
  font-size: 12px;
  color: #f00;
  margin: 10px 0;
  text-align: justify;
  display: none;
}

#register-box input:not([tpye="submit"]):focus {
  border-color: rgba(72, 125, 204, 1);
}

#register-box input[type="submit"] {
  margin: 0;
  border: none;
  font-size: 16px;
  cursor: pointer;
  background-color: #ccc;
  color: #000;
  transition: 0.3s;
}

#register-box input[type="submit"]:hover {
  background-color: rgba(72, 125, 204, 1);
  color: #fff;
}

JavaScript

function check() {
  let registerBtn = event.target;
  let registerBox = registerBtn.closest("form#register-box");

  // 檢查用戶暱稱
  let userName = registerBox.querySelector("#username").value;
  if (userName === "" || userName.length > 40) {
    let userNameAlert = registerBox.querySelector("#userNameAlert");
    userNameAlert.style.display = "block";
  } else {
    userNameAlert.style.display = "none";
  }
  // 檢查信箱
  let email = registerBox.querySelector("#email").value;

  // includes 沒找到對應字串,返回false;有找到會返回true
  let validIncludes = email.includes("@");
  // indexOf 沒找到對應字串,返回 -1;有找到會返回第一個符合指定字串的索引值
  let validIndexOf = email.indexOf("@");
  if (validIndexOf === -1) {
    // -1仍為true,,所以找不到時,要改為0才會是false
    validIndexOf = 0;
  }
  // match 沒找到對應字串,返回null;有找到會返回array
  let validRegExpMatch = email.match(/@/);
  // test 沒找到對應字串,返回false;有找到會返回true
  let validRegExpTest = /@/.test(email);

  // 檢查字串方法,會有支援度問題
  // 沒有輸入文字就不可能找到@,所以也不用特別設定email === ''
  if (validIncludes || validIndexOf || validRegExpMatch || validRegExpTest) {
    emailAlert.style.display = "none";
  } else {
    emailAlert.style.display = "block";
  }

  // 檢查密碼
  let password = registerBox.querySelector("#password").value;
  console.log(password.length);
  if (password === "" || password.length < 8 || password.length > 100) {
    let passwordAlert = registerBox.querySelector("#passwordAlert");
    passwordAlert.style.display = "block";
  } else {
    passwordAlert.style.display = "none";
  }
}