<input>에 텍스트가 아닌 공백만 있을 때, label이 원래 자리로 내려오지 않는 이슈
emailInputNodeArr.forEach(function (item, index) {item.addEventListener('input', (e) => {consttargetParentNode=e.target.parentNode// 사용자가 입력한 정보의 글자 개수가 빈 공백을 지우고 나서 0일 때 valid 상태가 아님을 인지if (e.target.value.trim().length===0) {targetParentNode.classList.remove(VALID_CLASS) } })// input이 포커스 상태가 아닐 때, 사용자가 입력한 정보의 글자 개수가 // 빈 공백을 지우고 나서 0일 때 valid 상태가 아님을 인지 item.addEventListener('blur', (e) => {if (e.target.value.trim().length===0) {e.target.parentNode.classList.remove(VALID_CLASS) } })})
문제 (2)
입력을 위해 <input>을 클릭 했을 때 label이 선택되었다. 그래서 'focus' 이벤트가 발생했을 때 select() 메서드에 setTimeout()을 사용해서 시간을 추가한다.
// label의 text가 선택되는 것을 방지 하기 위해 포커스 이벤트에 시간 추가item.addEventListener('focus', (e) => {if (e.target.value.trim().length===0) {window.setTimeout(() =>e.target.select()) } })
결론
constemailContainerNode=document.querySelectorAll('.emailContainer__block')constemailInputNode=document.querySelectorAll('.emailContainer__block input')constINVALID_CLASS='emailContainer__block--invalid'constVALID_CLASS='emailContainer__block--valid'constemailInputNodeArr=Array.from(emailInputNode)emailInputNodeArr.forEach(function (item, index) {item.addEventListener('input', (e) => {constisInvalid=e.target.matches(':invalid')consttargetParentNode=e.target.parentNodeif (isInvalid) {// 유효하지 않은 상태targetParentNode.classList.remove(VALID_CLASS)targetParentNode.classList.add(INVALID_CLASS) } else {// 유효한 상태targetParentNode.classList.remove(INVALID_CLASS)targetParentNode.classList.add(VALID_CLASS) }// 사용자가 입력한 정보의 글자 개수가 빈 공백을 지우고 나서 0일 때 valid 상태가 아님을 인지if (e.target.value.trim().length===0) {targetParentNode.classList.remove(VALID_CLASS) } })// input이 포커스 상태가 아닐 때, 사용자가 입력한 정보의 글자 개수가 빈 공백을 지우고 나서 0일 때 valid 상태가 아님을 인지item.addEventListener('blur', (e) => {if (e.target.value.trim().length===0) {e.target.parentNode.classList.remove(VALID_CLASS) } })// label의 text가 선택되는 것을 방지 하기 위해 포커스 이벤트에 시간 추가item.addEventListener('focus', (e) => {if (e.target.value.trim().length===0) {window.setTimeout(() =>e.target.select()) } })})