老友記之PHP7留言板開(kāi)發(fā)(Ajax異步提交)

前言

這節(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ū)涂鴉!~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狠毯,一起剝皮案震驚了整個(gè)濱河市护糖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嚼松,老刑警劉巖嫡良,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異献酗,居然都是意外死亡寝受,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)罕偎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)很澄,“玉大人,你說(shuō)我怎么就攤上這事颜及∷粒” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵俏站,是天一觀的道長(zhǎng)讯蒲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)肄扎,這世上最難降的妖魔是什么墨林? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任赁酝,我火速辦了婚禮,結(jié)果婚禮上旭等,老公的妹妹穿的比我還像新娘酌呆。我一直安慰自己,他們只是感情好搔耕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布隙袁。 她就那樣靜靜地躺著,像睡著了一般度迂。 火紅的嫁衣襯著肌膚如雪藤乙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天惭墓,我揣著相機(jī)與錄音坛梁,去河邊找鬼。 笑死腊凶,一個(gè)胖子當(dāng)著我的面吹牛划咐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钧萍,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼褐缠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了风瘦?” 一聲冷哼從身側(cè)響起队魏,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎万搔,沒(méi)想到半個(gè)月后胡桨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞬雹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年昧谊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酗捌。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呢诬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胖缤,到底是詐尸還是另有隱情尚镰,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布哪廓,位于F島的核電站狗唉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏撩独。R本人自食惡果不足惜敞曹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望综膀。 院中可真熱鬧澳迫,春花似錦、人聲如沸剧劝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讥此。三九已至拢锹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萄喳,已是汗流浹背卒稳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留他巨,地道東北人充坑。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像染突,于是被迫代替她去往敵國(guó)和親捻爷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5份企? 答:HTML5是最新的HTML標(biāo)準(zhǔn)也榄。 注意:講述HT...
    kismetajun閱讀 27,474評(píng)論 1 45
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 你說(shuō)甜紫,這周不回了,下周再回俐芯。我說(shuō)隨你吧棵介。 其實(shí),我想說(shuō)的是吧史,第二周我就希望你回來(lái)邮辽,可這已經(jīng)是第五周了。一周一周地等...
    真冉閱讀 225評(píng)論 0 0
  • 如果你的問(wèn)題沒(méi)有得到很好很快的解決贸营,很可能是你的提問(wèn) 姿勢(shì)不對(duì)喲吨述,想要良好的體驗(yàn),“姿勢(shì)"很重要3揣云! 一、幾種錯(cuò)誤...
    Faye小峰閱讀 250評(píng)論 0 2