# JS_練習_登入頁面 製作一個登入頁面,讓使用者得以輸入個人資訊,並設定輸入條件,像是: - 若使用者尚未輸入任何資訊或是輸入條件不符,輸入欄出現警示紅框 - 在信箱部分只能輸入信箱資料 - 在使用者名稱或密碼設定輸入字數條件 ## HTML 1. 可以使用vscode快捷鍵 `cmd +d` 選取下一個相同的字。 2. 使用bootstraps設定容器,使容器可以隨著螢幕伸縮改變,呈現RWD的效果 ## CSS 1. `visibility` 屬性: - visable : 產生的 box 是可見的 - none : 產生的 box 是不可見的讓元素/物件隱藏起來 - 與display:none 最大差別是,D-N是整個屬性關閉 2. :root - 使用:root設定顏色變數,在做顏色調用時可以直接輸入變數取用 ```.css :root{ --success-color:#2ecc71; --error-color: #e74c3c; } /*----取用時----*/ h1{ color: var(--success-color) } ``` ## JS 1. 先宣告變數,利用getElementById取得元素 2. 加入Eventlistener事件監聽 註冊一個`submit`事件, 這邊的`e.preventDefault();`是用來停止預設的submit這個行為: ```javascript= // Eventlistener form.addEventListener('submit', function(e) { //註冊事件 e.preventDefault(); //停止預設行為 }) ``` 並在事件裡導入判斷函式showSuccess()/ showError() ### showError功能 - 當輸入條件不符合時,設定的tag `<small>`會顯示出錯誤訊息 - 利用元素.className方法,加入`form-group error`屬性,帶入css,使輸入匡變成紅色。 ### showSuccess功能 - 沒有錯誤訊息,將class名稱改成`form-group success`來讓css可以正確將輸入框顯示綠色。 ### checkRequired功能 #### getFieldName 返回將輸入的id資訊,第一個字母變成大寫。 - `charAt(0)`回傳第0個值,再加上後面的小寫字元 - `slice([begin, end])`回傳陣列,可選澤從開始到結束的值。 - 判斷判斷式是否輸入正確,將輸入的陣列資訊每個值透過`forEach`讀取,再利用`trim()`方法,將空白字串去除 ```.js // Get fieldname function getFieldName(input) { return input.id.charAt(0).toUpperCase() + input.id.slice(1); } // Check required fields function checkRequired(inputArr) { inputArr.forEach(function(input) { if(input.value.trim() === ''){ showError(input, `${getFieldName(input)} is required`); } else { showSuccess(input); } }); } ``` ### Email格式驗證 - 透過別人寫好的emial驗證函式,直接帶入驗證,並加入if迴圈,設定不同情況所執行不同的showError() ```.js= function isValidEmail(input) { const re = /^(([^<>()[\]\\.,;:\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,}))$/; // return re.test(String(email).toLowerCase()); if(re.test(input.value.trim())) { showSuccess(input); } else { showError(input, 'Email is not valid'); } } ``` ### 調整驗證機制 原本一開始是設定submit事件,並在function帶入多項if迴圈判斷,但這樣顯得整個程式碼繁雜。可以透過導入設定好的判斷函式,簡化程式碼。 ```.js form.addEventListener('keyup',function(e){ e.preventDefault(); checkRequired([username, email, password, password2]); checkLength(username, 3, 15); checkLength(password, 8, 16); isValidEmail(email); if(!checkRequired([password, password2])){ checkLength(password, 8, 16); checkPasswordMatch(password, password2); } }) ``` 並已將function checkLength/checkRequired/ isValidEmail設定好在上面 - checkLength - 帶入三個參數,分別為input, min, max,利用條件判斷要是`input`小於 或是 大於設定條件,就會帶入showError()函式,否則就會導入成功函式 - `‵‵`或是`${}`是E6的新語法,可以在裡面放置變數 ```.js function checkLength(input, min, max) { if(input.value.length < min) { showError(input, `${getFieldName(input)} must be at least ${min} characters`); } else if (input.value.length > max) { showError(input, `${getFieldName(input)} must be less than ${max} characters`); } else { showSuccess(input); } } ``` ###### tags: `javascript`