JavaScript 系列三:練習4

表單驗證

by applelily

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JavaScript 系列三:練習4 ── 表單驗證</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:[email protected]&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="./js_form_validation.css">
</head>
<body>
    <div class="container">
        <form action="" method="get" >
            <div class="header">註冊帳戶
                <hr>
            </div>
                  
            <input type="text" name="NickName" id="nick-name" required>
            <div class="labelline">暱稱</div>
            <div class="err err-nick-name">
                *不能為空白、必須在40字以內
            </div>
                                
            <input type="email"
            name="Email" id="email" required>
            <div class="labelline">Email 電子郵件</div>
            <div class="err err-email">*不能為空白、必須包含 @ 符號</div>
    
            <input type="password" 
            name="current-password" id="current-password" required>
            <div class="labelline">密碼</div>
            <div class="err err-password">
                * 不能為空白、必須在8字以上、必須在100字以內
            </div>
    
            <div class="button-container">
                <button class="submit" type="submit" onclick="btn_submit(event)">註冊
                
                    <div class="toast-success">
                        ✅ 註冊成功!可以查看 Email 確認細節!
                    </div>
                
                </button>
 
            </div>
        </form>
    </div>
 

<script src="./js_form_validation.js"></script>

</body>
</html>

CSS

/* Hex Color Code 
    #ebcbbb 膚色
    #6c999a tiffiny綠
    #0e2222 深藍色
    #DF3079 粉色  

    */
*{
    font-family: "Noto Sans TC", sans-serif;
}
body{
    display: flex;
    justify-content: center;
    align-items:center;
    min-height: 100vh;   /* 要設定高度 align-items 才有效 */
    background-color: #ebcbbb ;
}
.container{
    display: flex;
    justify-content: center;
    align-items: center;
    color: #0e2222;
    width: 540px;
    height: 450px ;
    background: #6c999a;
    padding: 20px;
    border-radius: 10px;
    box-shadow: 0 0 15px rgba(0, 0, 0, 0.6);
    position: relative;
}
.header{
    text-align: center;
    font-size: 1.5em;
    margin-bottom: 35px;
}

input{
    margin-top: 30px;
    width: 450px;
    height: 40px ;
    font-size: 18px;
    background: transparent;
    transition: 0.1s ease;
    border: 1px solid #0e2222;
    border-radius: 5px;
    color: #212121;
}


.labelline{
    position: absolute;
    background: #6c999a;
    margin-top: -33px;
    margin-left: 5px;;
    transition: 0.2s ease;
}

input:focus{
    outline: none;   /* 不要秀出邊框 */
   
}

input:focus + .labelline ,
input:valid + .labelline{
    /* color: #0e2222; */
    color: #DF3079;
    padding: 0.12px;
    transform: translate(1.5px, -21px) scale(0.9);
    z-index: 1111;
}

.err{
    visibility: hidden;
    color:#f00;
    font-size: 13px;
}

 /* button 要變更位置,需要在外面包一層wrap .button-container */
.button-container {    
    display: flex;
    justify-content:end;
    width: 100%;
    margin-top: 20px;

}
button.submit {
    padding: 10px 20px;
    font-size: 16px;
    cursor: pointer;
    background-color: #0056b3 ;
    color: white;
    border: none;
    border-radius: 5px;
    transition: background-color 0.3s ease;
}

button.submit:hover {
    background-color: #0e2222;
}


.toast-success{
    display:none;
    font-size:15px;
    position: absolute;
    background-color: #C6F6D5;
    color: #276749;
    border-radius: 15px;
    padding: 12px 15px;
    top:0;
    left:...

JavaScript

function btn_submit(event) {
    event.preventDefault(); // 防止表單提交

    let valid = true;

    // 驗證暱稱
    let nickname = document.querySelector('#nick-name').value.trim();
    if (nickname === "" || nickname === null | nickname.length>40) {
        let elem_err_nickname = document.querySelector('.err-nick-name');
        elem_err_nickname.style.visibility = 'visible';
        valid = false;
    } else {
        let elem_err_nickname = document.querySelector('.err-nick-name');
        elem_err_nickname.style.visibility = 'hidden';
    }

    // 驗證電子郵件
    let email = document.querySelector('#email').value.trim();
    if (email === "" || !email.includes('@')) {
        let elem_err_email = document.querySelector('.err-email');
        elem_err_email.style.visibility = 'visible';
        valid = false;
    } else {
        let elem_err_email = document.querySelector('.err-email');
        elem_err_email.style.visibility = 'hidden';
    }

    // 驗證密碼
    let password = document.querySelector('#current-password').value.trim();
    if (password === "" || password.length < 8 || password.length > 100) {
        let elem_err_password = document.querySelector('.err-password');
        elem_err_password.style.visibility = 'visible';
        valid = false;
    } else {
        let elem_err_password = document.querySelector('.err-password');
        elem_err_password.style.visibility = 'hidden';
    }

    // 如果所有字段都有效,允許表單提交
    if (valid) {
                // 清空所有输入字段
                document.querySelector('#nick-name').value = '';
                document.querySelector('#email').value = '';
                document.querySelector('#current-password').value = '';
                document.querySelector('.toast-success').style.display='block';
        
    }
    else{
                document.querySelector('.toast-success').style.display='none';
    }
}