前言
這節(jié)教程算是這個(gè)專(zhuān)輯的重中之重吧。隨著前端技術(shù)的不斷迭代更新埋心,網(wǎng)站很多功能的實(shí)現(xiàn)都轉(zhuǎn)移到前端去實(shí)現(xiàn)指郁,2018年第一季度編程語(yǔ)言排名來(lái)看,JavaScript仍然是最受歡迎的編程語(yǔ)言拷呆。所以想要深入學(xué)習(xí)js闲坎,那么Ajax是必不可少的。
在前面課程講過(guò)js驗(yàn)證茬斧,課件代碼是在老友記之PHP7留言板開(kāi)發(fā)(JS驗(yàn)證)基礎(chǔ)上改動(dòng)腰懂,只需加入ajax異步操作部分即可輕松完成。
需要注意的是项秉,這里不再詳細(xì)講解什么是XMLHttpRequest對(duì)象绣溜,為什么要用它等等,相信你再能運(yùn)用的情況下再去深入了解它會(huì)印象更加深刻娄蔼,這里就盡可能的少一些文字類(lèi)的應(yīng)試教學(xué)并能達(dá)到學(xué)會(huì)效果怖喻。
打開(kāi)編輯器開(kāi)始動(dòng)手吧!
Ajax異步的核心部分講解
// 第一步 創(chuàng)建 XMLHttpRequest 對(duì)象岁诉,為了更容易理解锚沸,變量就用ajax
var ajax = new XMLHttpRequest();
// 第二步 初始化一個(gè)Ajax請(qǐng)求,url參數(shù)是遠(yuǎn)程請(qǐng)求地址ajax.php
ajax.open('POST', url, true); // 這里用到post提交留言涕癣,所以用post方式提交給服務(wù)器
// ajax.open('GET', url, true); // get方式請(qǐng)求服務(wù)器
// 第三步 發(fā)送請(qǐng)求哗蜈;如果該請(qǐng)求是異步模式(默認(rèn)),該方法會(huì)立刻返回属划。
ajax.send(inputdata);
// 第四步 發(fā)送請(qǐng)求總該要知道有沒(méi)收到吧,這里就需要用到Ajax的事件監(jiān)聽(tīng)器onreadystatechange
ajax.onreadystatechange = function(){
// 這里判斷服務(wù)器是否有數(shù)據(jù)響應(yīng)候生,如果有則做些你要處理的邏輯同眯,比如提示用戶(hù)操作成功
}
上面四步驟還理解不了的話(huà),可以認(rèn)為是第一步找個(gè)朋友A發(fā)郵件唯鸭,第二步給這位A朋友寫(xiě)信件內(nèi)容并封裝寫(xiě)上地址貼郵票须蜗,第三步投遞郵件,過(guò)了一陣(當(dāng)然網(wǎng)絡(luò)通的情況下立即有響應(yīng)的),第四步收到A朋友的回信了明肮,很開(kāi)心菱农。接下來(lái)就可以根據(jù)回信內(nèi)容做事啦,比如見(jiàn)(網(wǎng))面(約)...
好了就到這里柿估,下面是完整代碼循未。
HTML+JS頁(yè)面代碼
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>留言板_科科分享</title>
<!-- 2.新建css樣式文件并根據(jù)效果圖編寫(xiě)css代碼 -->
<link rel="stylesheet" href="feedback.css">
<!-- 3.js表單驗(yàn)證 -->
<script type="text/javascript">
function checkform(){
var nickname = document.getElementsByTagName('input')[0].value; // 獲取用戶(hù)輸入的姓名
var tel = document.getElementsByTagName('input')[1].value; // 獲取用戶(hù)輸入的聯(lián)系方式
var content = document.getElementsByTagName('textarea')[0].value; // 獲取用戶(hù)輸入的留言?xún)?nèi)容
// 如果沒(méi)有輸入姓名 則提示
if(nickname == ''){
alert('請(qǐng)輸入您的姓名');
document.getElementsByTagName('input')[0].focus(); // 將光標(biāo)定位到姓名輸入框
return false; // 阻止冒泡 輸入姓名后才能通過(guò)
}
// 如果沒(méi)有輸入聯(lián)系方式 則提示
if(tel == ''){
alert('請(qǐng)輸入您的聯(lián)系方式');
document.getElementsByTagName('input')[1].focus(); // 將光標(biāo)定位到聯(lián)系方式輸入框
return false; // 阻止冒泡 輸入聯(lián)系方式才能通過(guò)
}
// 如果沒(méi)有輸入留言?xún)?nèi)容 則提示
if(content == ''){
alert('請(qǐng)輸入您的聯(lián)系方式');
document.getElementsByTagName('textarea')[0].focus(); // 將光標(biāo)定位到留言?xún)?nèi)容輸入框
return false; // 阻止冒泡 輸入留言?xún)?nèi)容才能通過(guò)
}
// js已經(jīng)拿到了用戶(hù)提交的數(shù)據(jù),那接下來(lái)就是AJAX(頁(yè)面無(wú)刷新提交數(shù)據(jù)到服務(wù)器-異步通信)
// 異步請(qǐng)求 start
var ajax, url, inputdata;
// 創(chuàng)建 XMLHttpRequest 對(duì)象
if(window.XMLHttpRequest){
ajax = new XMLHttpRequest();
}else{
// 兼容Internet Explorer(IE5 和 IE6)使用 ActiveX 對(duì)象
ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
url = 'ajax.php';
ajax.open('POST', url, true);
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded;"); // 用POST的時(shí)候一定要有這句
inputdata = 'nickname='+nickname+'&tel='+tel+'&content='+content;
ajax.send(inputdata);
// 接收服務(wù)器返回的數(shù)據(jù)
ajax.onreadystatechange = function(){
// 獲取服務(wù)器響應(yīng)狀態(tài)碼
if(ajax.readyState == 4 && ajax.status==200){
// 獲取服務(wù)器返回的響應(yīng)返回的數(shù)據(jù)
var retdata = ajax.responseText;
if(retdata == 1){
alert('留言信息已提交成功秫舌!感謝您的寶貴意見(jiàn)的妖。');
}
}
}
// 異步請(qǐng)求 end
return false; // 這里是為了方式submit點(diǎn)擊后表單自動(dòng)提交
// document.feedback_form.submit(); // 提交用戶(hù)數(shù)據(jù)到后端action中的地址
}
</script>
</head>
<body>
<!-- 工作區(qū),呈現(xiàn)給用戶(hù)看的 -->
<!-- 1.開(kāi)始搭建腳手架 -->
<div class="container_box">
<div class="up">
<h3 class="title">留言板</h3>
<h5 class="subtitle">FEEDBACK</h5>
</div>
<div class="down">
<form name="feedback_form" action="/#" method="post" onsubmit="return false;">
<div class="input">
<input type="text" class="fl" name="name" placeholder="輸入您的姓名" />
<input type="text" class="fr" name="tel" placeholder="輸入您的聯(lián)系方式" />
</div>
<textarea class="content" cols="30" rows="10" name="nr"></textarea>
<input type="submit" onclick="checkform()" value="提交您的留言" class="sub" />
</form>
</div>
</div>
</body>
</html>
PHP代碼(ajax.php)
<?php
include 'config.php';
// POST接收用戶(hù)提交的數(shù)據(jù)
$nickname = !empty($_POST['nickname'])? addslashes(strip_tags($_POST['nickname'])):''; // 留言人名稱(chēng)
$tel = !empty($_POST['tel'])?addslashes(strip_tags($_POST['tel'])):''; // 留言人的聯(lián)系方式
$content = !empty($_POST['content'])?addslashes(strip_tags($_POST['content'])):''; // 留言?xún)?nèi)容
$time = time(); // 當(dāng)前系統(tǒng)時(shí)間足陨,即用戶(hù)留言時(shí)間
// 插入mysql語(yǔ)句
$sql = "INSERT INTO feedback (name, contact, content, addtime) VALUES ('{$nickname}', '{$tel}', '{$content}', '{$time}')";
// 立即執(zhí)行mysql語(yǔ)句
$result = mysqli_query($mysqli, $sql); // 返回一個(gè)資源標(biāo)識(shí)符嫂粟,通常是數(shù)字
$insert_id = mysqli_insert_id($mysqli); // 返回?cái)?shù)據(jù)表的自增長(zhǎng)ID,比如新用戶(hù)注冊(cè)返回用戶(hù)ID
// echo $insert_id; // 當(dāng)你在調(diào)試的時(shí)候墨缘,你會(huì)發(fā)現(xiàn)echo是很好的幫手星虹。
if($insert_id > 0){
// 如果入庫(kù)成功,這里可以處理其他想要的邏輯
echo 1;
exit; // 退出程序镊讼,使其不再往下執(zhí)行代碼
}
// 這是錯(cuò)誤的時(shí)候返回0
echo 0;
exit;
記得動(dòng)手練習(xí)哦宽涌!歡迎下面評(píng)論區(qū)涂鴉!~