1、建立表單
<form>
<div class="item">
<label>使用者名</label>
<input id="username" name="username" type="text">
<span id="usernameTips"></span>
</div>
<div class="item">
<label>密碼</label>
<input id="password" name="password" type="password">
<span id="passwordTips"></span>
</div>
<div class="item">
<label>确認密碼</label>
<input id='password1' name="password1" type="password">
<span id="password1Tips"></span>
</div>
<div class="submit">
<button type="button" id="submitBtn">注冊</button>
</div>
</form>

2、引入封裝函數
3、擷取元素
let username = document.getElementById("username");
let password = document.getElementById("password");
let password1 = document.getElementById("password1");
let usernameTips = document.getElementById("usernameTips");
let passwordTips = document.getElementById("passwordTips");
let password1Tips = document.getElementById("password1Tips");
let submitBtn = document.getElementById("submitBtn");
4、定義兩個變量,用于判定是否可以送出資料
let username_lock = false;
let password_lock = false;
5、使用者名輸入框事件
當使用者名輸入框失去焦點的時候,先檢查是否通過正則驗證,再通過發送AJAX請求,檢查輸入的使用者名是否已經存在。如果存在,則不能使用該使用者名,此時username_lock設為false,因為設計資料庫時,将使用者名設為了主鍵,主鍵不能重複。如果使用者名不存在,則可以注冊該使用者名,此時username_lock設為true。
// 使用者名輸入框失去焦點事件
username.onblur = function(){
// 擷取使用者名
let usernameVal = username.value;
// 正則,不能以數字開頭,可以包含數字字母下劃線,不能少于6位多于14位
let reg = /^[^\d]\w{6,14}$/;
// 檢測是否通過正則驗證
let result = reg.test(usernameVal);
// 如果驗證失敗,顯示紅色 ×
usernameTips.innerHTML = result ? "" : "×";
usernameTips.style.color = result ? "" : "red";
// 如果驗證通過,則進行下一道驗證,如果驗證失敗,則不進行下一道驗證,并且username_lock保持false,直接return
if(!result){
username_lock = false;
return;
}
// 驗證通過,發送ajax請求,檢測是否重名,因為username被設定為主鍵,不允許重名
AJAX.get("/06_regist/05_checkusername.php", {username:usernameVal}, function(data){
// 如果不存在重名
if(!data.error){
// 開鎖
username_lock = true;
// 提示使用者該使用者名可以被注冊
usernameTips.innerHTML = "√";
usernameTips.style.color = "green";
}else{
alert(data.msg)
// 提示使用者該使用者名不可以被注冊
usernameTips.innerHTML = "×";
usernameTips.style.color = "red";
}
})
}
使用者名不存在:
使用者名已存在:
驗證使用者名接口檔案
<?php
// 1、接收前端傳遞過來的資料
$username = $_GET["username"];
// 2、連接配接資料庫
mysql_connect("localhost", "root", "123456");
// 3、選責資料庫
mysql_select_db("gx2006");
// 4、定義sql語句
$sql = "SELECT * FROM user WHERE username = '$username'";
// 5、執行sql語句
$result = mysql_query($sql);
// 6、查找使用者名是否存在
$row = mysql_fetch_array($result);
// 因為是根據主鍵查詢,是以查詢到的結果要麼有一條記錄,要麼沒有記錄
if($row){
echo json_encode(array('error' => 1, 'msg' => '使用者已存在,不可使用該使用者名'));
}else{
echo json_encode(array('error' => 0, 'msg' => '使用者不存在,可以使用該使用者名'));
}
?>
6、密碼輸入框事件
密碼輸入框失去焦點時,檢查密碼是否通過正則驗證。
// 密碼輸入框失去焦點事件
password.onblur = function(){
// 擷取密碼
let passwordVal = password.value;
// 定義正則
let reg = /^\w{8,16}$/;
// 檢測是否通過正則驗證
let result = reg.test(passwordVal);
// 如果驗證失敗,顯示紅色 ×;如果驗證成功,顯示綠色 √
passwordTips.innerHTML = result ? "√" : "×";
passwordTips.style.color = result ? "green" : "red";
}
密碼不通過正則驗證:
密碼通過正則驗證:
7、确認密碼輸入框事件
當确認密碼輸入框失去焦點時,先檢查是否通過正則驗證,如果驗證不通過,此時password_lock設為false。再檢查兩次密碼是否一緻,如果一緻,此時password_lock設為true。
// 确認密碼輸入框失去焦點事件
password1.onblur = function(){
// 擷取密碼
let passwordVal = password.value;
// 擷取确認密碼
let passwordVal1 = password1.value;
// 定義正則
let reg = /^\w{8,16}$/;
// 檢測是否通過正則驗證
let result = reg.test(passwordVal1);
// 如果驗證失敗
if(!result){
// 保持上鎖
password_lock = false;
password1Tips.innerHTML = "×";
password1Tips.style.color = "red";
return;
}
// 驗證通過,判斷密碼和确認密碼是否一緻
let isSAME = passwordVal === passwordVal1;
password1Tips.innerHTML = isSAME ? "√" : "×";
password1Tips.style.color = isSAME ? "green" : "red";
// 開鎖
password_lock = isSAME ? "true" : "false";
}
兩次密碼不一緻:
兩次密碼一緻:
8、密碼輸入框擷取焦點事件
由于可能有的使用者先輸入了确認密碼,再輸入密碼,将導緻在驗證上産生bug。為了解決該問題,我們設定當密碼輸入框獲得焦點的時候,不管确認密碼輸入框中是否存在内容,都将其清空。
// 密碼輸入框獲得焦點事件
// 将确認密碼輸入框的内容清空
password.onfocus = function(){
password1.value = "";
password1Tips.innerHTML = "";
}
9、注冊按鈕點選事件
點選注冊按鈕後,先判斷username_lock和password_lock兩個是否都為true,如果都為true,則可以送出AJAX請求,否則不可以送出AJAX請求。如果成功發送請求,成功注冊後,彈出提示“注冊成功”,然後跳轉頁面。
// 注冊按鈕點選事件
submitBtn.onclick = function(){
// 判斷兩個鎖是否為true
if(!(username_lock && password_lock)){
alert("資訊輸入錯誤,請重新檢查!");
return;
}
// 擷取使用者名
let user = username.value;
// 擷取密碼
let psw = password.value;
// 發送ajax請求
AJAX.post("/06_regist/05_regist.php", {username: user, password: psw}, function(data){
console.log(data);
// 如果注冊成功
if(!data.error){
setTimeout(function(){
location.href = "06_login.html";
}, 500)
} else{
alert(data.msg);
}
})
}
注冊成功:
注冊接口檔案
<?php
header("content-type: text/html;charset=utf-8");
// 1 接收前端傳遞過來的資料
$username = $_POST["username"];
$password = $_POST["password"];
// 2 連接配接資料庫
mysql_connect("localhost", "root", "123456");
// 3 選擇資料庫
mysql_select_db("gx2006");
// 4 定義sql語句
$sql = "INSERT INTO user VALUES('$username', '$password')";
// 5 執行sql語句
$result = mysql_query($sql);
// 6 擷取執行結果
if ($result) {
echo json_encode(array("error" => 0, "msg" => "注冊成功"));
} else {
echo json_encode(array("error" => 1, "msg" => "注冊失敗"));
}
?>
完整代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
form {
width: 600px;
height: 200px;
border: 2px solid #ccc;
margin: 100px auto;
}
.item {
display: flex;
height: 50px;
align-items: center;
}
.item label {
flex: 2;
text-align: right;
padding-right: 20px;
box-sizing: border-box;
}
.item input {
flex: 5;
}
.item span {
flex: 1;
text-align: center;
font-weight: bold;
}
.submit {
text-align: center;
}
.submit button {
width: 150px;
height: 30px;
background-color: pink;
border-color: pink;
color: white;
}
</style>
</head>
<body>
<form>
<div class="item">
<label>使用者名</label>
<input id="username" name="username" type="text">
<span id="usernameTips"></span>
</div>
<div class="item">
<label>密碼</label>
<input id="password" name="password" type="password">
<span id="passwordTips"></span>
</div>
<div class="item">
<label>确認密碼</label>
<input id='password1' name="password1" type="password">
<span id="password1Tips"></span>
</div>
<div class="submit">
<button type="button" id="submitBtn">注冊</button>
</div>
</form>
<script src="./AJAX.js"></script>
<script>
let username = document.getElementById("username");
let password = document.getElementById("password");
let password1 = document.getElementById("password1");
let usernameTips = document.getElementById("usernameTips");
let passwordTips = document.getElementById("passwordTips");
let password1Tips = document.getElementById("password1Tips");
let submitBtn = document.getElementById("submitBtn");
// 定義兩個鎖
let username_lock = false;
let password_lock = false;
// 使用者名輸入框失去焦點事件
username.onblur = function(){
// 擷取使用者名
let usernameVal = username.value;
// 正則,不能以數字開頭,可以包含數字字母下劃線,不能少于6位多于14位
let reg = /^[^\d]\w{6,14}$/;
// 檢測是否通過正則驗證
let result = reg.test(usernameVal);
// 如果驗證失敗,顯示紅色 ×
usernameTips.innerHTML = result ? "" : "×";
usernameTips.style.color = result ? "" : "red";
// 如果驗證通過,則進行下一道驗證,如果驗證失敗,則不進行下一道驗證,并且username_lock保持false,直接return
if(!result){
username_lock = false;
return;
}
// 驗證通過,發送ajax請求,檢測是否重名,因為username被設定為主鍵,不允許重名
AJAX.get("/06_regist/05_checkusername.php", {username:usernameVal}, function(data){
// 如果不存在重名
if(!data.error){
// 開鎖
username_lock = true;
// 提示使用者該使用者名可以被注冊
usernameTips.innerHTML = "√";
usernameTips.style.color = "green";
}else{
alert(data.msg)
// 提示使用者該使用者名不可以被注冊
usernameTips.innerHTML = "×";
usernameTips.style.color = "red";
}
})
}
// 密碼輸入框獲得焦點事件
// 将确認密碼輸入框的内容清空
password.onfocus = function(){
password1.value = "";
password1Tips.innerHTML = "";
}
// 密碼輸入框失去焦點事件
password.onblur = function(){
// 擷取密碼
let passwordVal = password.value;
// 定義正則
let reg = /^\w{8,16}$/;
// 檢測是否通過正則驗證
let result = reg.test(passwordVal);
// 如果驗證失敗,顯示紅色 ×;如果驗證成功,顯示綠色 √
passwordTips.innerHTML = result ? "√" : "×";
passwordTips.style.color = result ? "green" : "red";
}
// 确認密碼輸入框失去焦點事件
password1.onblur = function(){
// 擷取密碼
let passwordVal = password.value;
// 擷取确認密碼
let passwordVal1 = password1.value;
// 定義正則
let reg = /^\w{8,16}$/;
// 檢測是否通過正則驗證
let result = reg.test(passwordVal1);
// 如果驗證失敗
if(!result){
// 保持上鎖
password_lock = false;
password1Tips.innerHTML = "×";
password1Tips.style.color = "red";
return;
}
// 驗證通過,判斷密碼和确認密碼是否一緻
let isSAME = passwordVal === passwordVal1;
password1Tips.innerHTML = isSAME ? "√" : "×";
password1Tips.style.color = isSAME ? "green" : "red";
// 開鎖
password_lock = isSAME ? "true" : "false";
}
// 注冊按鈕點選事件
submitBtn.onclick = function(){
// 判斷兩個鎖是否為true
if(!(username_lock && password_lock)){
alert("資訊輸入錯誤,請重新檢查!");
return;
}
// 擷取使用者名
let user = username.value;
// 擷取密碼
let psw = password.value;
// 發送ajax請求
AJAX.post("/06_regist/05_regist.php", {username: user, password: psw}, function(data){
console.log(data);
// 如果注冊成功
if(!data.error){
alert(data.msg);
setTimeout(function(){
location.href = "06_login.html";
}, 500)
} else{
alert(data.msg);
}
})
}
</script>
</body>
</html>