国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 小白7天入門PHP Web開發(fā) - Day 5 Ajax實(shí)現(xiàn)前后端分離交互

小白7天入門PHP Web開發(fā) - Day 5 Ajax實(shí)現(xiàn)前后端分離交互

時(shí)間:2023-05-23 17:18:02 | 來源:網(wǎng)站運(yùn)營

時(shí)間:2023-05-23 17:18:02 來源:網(wǎng)站運(yùn)營

小白7天入門PHP Web開發(fā) - Day 5 Ajax實(shí)現(xiàn)前后端分離交互:
《小白7天入門PHP Web開發(fā)》系列文章,面向單純善良的完全不懂Web開發(fā)編程的入門速成課程,小白們?nèi)绻信d趣可以研讀此系列文章,也可以連線提問。各路大神有何指教還請(qǐng)指點(diǎn)一二。希望各路大神手下留情,注意維護(hù)自己的身份和形象。拜謝各位。
上一篇文章 我們了解PHP的基礎(chǔ)語法、PHP如何和前端表單交互、PHP的類和對(duì)象、函數(shù)等知識(shí),希望你能掌握簡(jiǎn)單的PHP前后端交互、理解類和函數(shù)封裝。這節(jié)我們繼續(xù)上節(jié)課講到的成績轉(zhuǎn)評(píng)級(jí)的案例,講解JQuery、Ajax的使用實(shí)現(xiàn)前后端分離以及與PHP的交互,讓用戶體驗(yàn)上更好。

一、回顧一下上節(jié)課的交互過程

還記得我們上節(jié)課的案例嗎?頁面長這樣的

圖 1-1 成績轉(zhuǎn)評(píng)級(jí)頁面
請(qǐng)求后端處理以后返回的結(jié)果是這樣的

圖 1-2 表單提交后的頁面
首先,我們要訪問php文件,還記得上節(jié)課說的php的環(huán)境配置嗎,不記得的回去先看看。然后看一下我們本節(jié)課的目錄文件結(jié)構(gòu)。我們本節(jié)課訪問的地址就是 localhost/day05/ 為根地址。觀察上面的圖也能看到。

圖 1-3 目錄結(jié)構(gòu),網(wǎng)站根目錄下的 day05目錄下再新建相關(guān)目錄和文件
代碼的話我們還是照常給大家貼出來(因?yàn)槲覍懳恼碌牡攸c(diǎn)、電腦不固定,所以差別可能在文件的路徑上)

<!-- score.html --><!-- 使用 localhost/score.html 訪問或直接用瀏覽器打開文件 --><!-- score.html文件應(yīng)與后續(xù).php文件在同一個(gè)目錄下 --><!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>成績轉(zhuǎn)評(píng)級(jí)</title> <style type="text/css"> /*通用樣式*/ * { font-size: 14px; margin: 0; padding: 0; } /*說明部分樣式*/ .explain { background-color: #f4f4f4; margin-top: 100px; padding: 20px 0px; } .block { text-align: left; width: 400px; margin: 0 auto; } .block ul { list-style: none; } /*表單部分樣式*/ .form { width: 400px; margin: 0 auto; margin-top: 20px; } .form input, .form button { height: 36px; box-sizing: border-box; margin-top: 10px; padding: 5px 10px; } .form input { width: 100%; } .form button { width: 100px; } </style></head><body> <div class="explain"> <div class="block"> <ul> <li>1、 學(xué)生成績90分(含)以上,評(píng)級(jí)為A</li> <li>2、 學(xué)生成績?cè)?0分(含)以上,90分以下,評(píng)級(jí)為B</li> <li>3、 學(xué)生成績?cè)?0分(含)以上,80分以下,評(píng)級(jí)為C</li> <li>4、 學(xué)生成績?cè)?0分以下,評(píng)級(jí)為D</li> </ul> </div> </div> <div class="form"> <form action="apis/scorelevel.php" method="get" accept-charset="utf-8" target="_blank" onsubmit="return checkform()"> <input type="text" name="study_name" value="" placeholder="請(qǐng)輸入學(xué)生姓名"> <input type="text" name="study_score" value="" placeholder="請(qǐng)輸入學(xué)生成績"> <br> <button type="submit">檢測(cè)評(píng)級(jí)</button> </form> </div> <script> function checkform() { var study_name = document.getElementsByName('study_name')[0].value; var study_score = document.getElementsByName('study_score')[0].value; if ( !(study_name && study_score) ) { alert('學(xué)生姓名和學(xué)生成績不能為空'); return false; } } </script></body></html>


<?php/** * apis/scorelevel.php * 我們以 “用戶輸入學(xué)生成績,根據(jù)學(xué)生成績對(duì)學(xué)生評(píng)級(jí)并輸出” 的功能需求來做示例 * 需求的基本內(nèi)容: * 學(xué)生成績90分(含)以上,評(píng)級(jí)為A * 學(xué)生成績?cè)?0分(含)以上,90分以下,評(píng)級(jí)為B * 學(xué)生成績?cè)?0分(含)以上,80分以下,評(píng)級(jí)為C * 學(xué)生成績?cè)?0分以下,評(píng)級(jí)為D */// 首先考慮,成績從哪里來?用戶輸入提交過來的# 獲取用戶提交的學(xué)生名字和成績$study_name = isset($_GET['study_name']) ? $_GET['study_name'] : '';$study_score = isset($_GET['study_score']) ? $_GET['study_score'] : '';// 初始化評(píng)級(jí)$level = '未知';$level_label = '未知';// 檢測(cè)姓名和分?jǐn)?shù)是否為空if ( $study_name == '' || $study_score == '' ) { echo '學(xué)生姓名和學(xué)生成績未知,請(qǐng)檢查提交的數(shù)據(jù)是否為空'; die;}// 根據(jù)分?jǐn)?shù)給學(xué)生評(píng)級(jí)if ( $study_score >= 90 ) { $level = 'A';} elseif ( $study_score >= 80 && $study_score < 90 ) { $level = 'B';} elseif ( $study_score >= 60 && $study_score < 80 ) { $level = 'C';} elseif ( $study_score < 60 ) { $level = 'D';} else { $level = '未知';}switch ( $level ) { case 'A': $level_label = '優(yōu)秀'; break; case 'B': $level_label = '良好'; break; case 'C': $level_label = '及格'; break; case 'D': $level_label = '差'; break;}echo '學(xué)生 '.$study_name.' 的成績?yōu)?'. $study_score .',評(píng)級(jí)為:'.$level.'('. $level_label .')';die;1、我們分解一下這個(gè)交互過程

頁面的表單直接將表單提交到 scorelevel.php 后端文件進(jìn)行處理,這個(gè)php文件處理后就直接將結(jié)果返回給了瀏覽器頁面。請(qǐng)看下面代碼里表單標(biāo)簽 form里的屬性 action的值,正是要提交到的頁面的文件路徑

<div class="form"> <form action="apis/scorelevel.php" method="get" accept-charset="utf-8" target="_blank" onsubmit="return checkform()"> <input type="text" name="study_name" value="" placeholder="請(qǐng)輸入學(xué)生姓名"> <input type="text" name="study_score" value="" placeholder="請(qǐng)輸入學(xué)生成績"> <br> <button type="submit">檢測(cè)評(píng)級(jí)</button> </form></div>現(xiàn)在有一個(gè)問題是我們每次提交表單都會(huì)出現(xiàn)一個(gè)新的瀏覽器標(biāo)簽頁面(如果沒試過的話盡快嘗試一下運(yùn)行起來),有沒有感覺有點(diǎn)不爽,點(diǎn)一次打開個(gè)新頁面,然后下一個(gè)成績又得去切換再填一次再點(diǎn)一次“檢測(cè)評(píng)級(jí)”。好在,我們可以很簡(jiǎn)單的解決這個(gè)問題,就是不打開新的頁面,在當(dāng)前頁面提交表單。只需要對(duì)html代碼稍微修改一下即可

<form action="apis/scorelevel.php" method="get" accept-charset="utf-8" target="_blank" onsubmit="return checkform()"><!-- 修改為如下代碼 --><form action="apis/scorelevel.php" method="get" accept-charset="utf-8" target="_self" onsubmit="return checkform()">實(shí)際上就是把表單的屬性 target 的值 _blank 改成了 _self,可以理解為前者是打開新頁面然后提交表單,后者是在當(dāng)前頁面提交表單,后者其實(shí)是可以省略的,也就是把整個(gè) target 去掉,跟 target="_self" 效果是一樣的。大家試試就很容易知道這個(gè)結(jié)果了。

這個(gè)時(shí)候不打開新頁面了。但是有沒有發(fā)現(xiàn)另外一個(gè)問題,就是每次還得返回到表單頁面,才能重新再提交新的成績和學(xué)生。是不是還是很煩?怎么辦呢?還記得我們說過嗎?PHP是解釋型腳本語言,是可以嵌入到HTML里面去的,那么我們有(jue)沒(dui)有(you)理由想到,既然是提交到php文件處理,那么如果提交到當(dāng)前文件,php代碼也能處理,那不就是實(shí)現(xiàn)了提交到當(dāng)前頁面嗎?說干就干,在html代碼里把php代碼嵌入進(jìn)來,就是把php代碼寫進(jìn)html文件里面,但是!記住了,php代碼要能執(zhí)行,文件名后綴必須是.php。于是,我們有了下面的代碼。

<html><!-- 這里是HTML代碼,和上面的頁面一樣的部分就不寫出來了 --><!-- 只修改了表單屬性action為空表示提交到當(dāng)前頁面(他自己) --> <form action="" method="get" accept-charset="utf-8" onsubmit="return checkform()"> <!-- 表單內(nèi)容代碼跟上面的一樣 --> </form></html><?php // 1、把php代碼的首尾標(biāo)簽協(xié)商 // 2、把scorelevel.php里面的php代碼直接拷貝(復(fù)制粘貼)到這里來就可以了 // some php code?>然后我們用瀏覽器打開鏈接 localhost/day05/scoresubmit.php

圖 1-4 提交前
現(xiàn)在我們提交一個(gè)表單數(shù)據(jù)看看結(jié)果。

圖 1-5 提交后
你有沒有發(fā)現(xiàn),我們提交到的就是當(dāng)前頁面哦,也能正確輸出了。So,我們是不是解決了上面所有的問題了。

那么現(xiàn)在就真的沒有問題了嗎?(明知故問)我都這么說了,證明肯定還有問題呀~!

第一、每次提交頁面會(huì)刷新

第二、HTML代碼和PHP代碼混在了一起,后期維護(hù)起來會(huì)非常麻煩(當(dāng)HTML代碼很多,php業(yè)務(wù)代碼也很多的時(shí)候)雖然現(xiàn)在你還沒有發(fā)現(xiàn),但請(qǐng)記住,真的會(huì)變得非常困難,這就像你的褲子和衣服一起堆在衣柜的一個(gè)格子里,剛開始兩三件,問題不大,哪天你買了一百條褲子一百件衣服,這個(gè)時(shí)候找一條褲子,請(qǐng)發(fā)揮你的想象力。

所以說嘛,不論是用戶體驗(yàn)上還是代碼可維護(hù)性上來講,我們都應(yīng)該需要改變。

二、Ajax

為了解決上面的問題,我們有一個(gè)前后端分離的這樣一個(gè)概念,還有一個(gè)MVC的概念。這里我們不做深入討論,因?yàn)檫@個(gè)課程面對(duì)的電腦和手機(jī)前的你,還不需要深入去了解,但請(qǐng)記住一句話,他們解決了前端開發(fā)人員必須等待后端開發(fā)人員開發(fā)完業(yè)務(wù)邏輯后再去完成頁面開發(fā)(或者反過來)的問題,為前后端開發(fā)人員協(xié)同開發(fā)、提升開發(fā)效率、減少前后端相互影響、減輕后端服務(wù)器壓力、讓應(yīng)用(網(wǎng)站)更易擴(kuò)展和維護(hù)等問題。需要你最好自主了解一下這兩個(gè)概念,這里推薦一個(gè)典型的MVC PHP框架(框架就是一種能幫助你快速實(shí)現(xiàn)業(yè)務(wù)邏輯不用關(guān)注實(shí)現(xiàn)路由、數(shù)據(jù)層等底層?xùn)|西的一個(gè)PHP應(yīng)用),幫助你從MVC模式開始理解前后端分離,框架名稱叫 CodeIgniter 中文網(wǎng) 。

我們還是回到簡(jiǎn)單一點(diǎn)的內(nèi)容,我們大多數(shù)實(shí)現(xiàn)分離和不刷新頁面所使用的技術(shù)就是 Ajax 了。這個(gè)是Javascript的一個(gè)功能。

Ajax 即“Asynchronous Javascript And XML”(異步 JavaScript 和 XML),是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。
Ajax = 異步 JavaScript 和 XML 或者是 HTML(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)。
Ajax 是一種用于創(chuàng)建快速動(dòng)態(tài)網(wǎng)頁的技術(shù)。
Ajax 是一種在無需重新加載整個(gè)網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù)。
通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,Ajax 可以使網(wǎng)頁實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下,對(duì)網(wǎng)頁的某部分進(jìn)行更新。
傳統(tǒng)的網(wǎng)頁(不使用 Ajax)如果需要更新內(nèi)容,必須重載整個(gè)網(wǎng)頁頁面。
以上引用自百度百科 ajax(Ajax 開發(fā))_百度百科
我們知道Javascript可以直接實(shí)現(xiàn)很多功能,包括了ajax,但是使用起來并沒有那么方便。所以大佬們就做了一個(gè)叫 JQuery(JQ) 的js代碼庫(放很多優(yōu)化過的js代碼的地方),我們可以直接使用這個(gè)庫,就可以完成很多js原生寫起來比較復(fù)雜或代碼量比較多的功能了,of course~包括我們的 ajax。

1、引入JQuery

要使用JQuery這個(gè)庫,當(dāng)然就必須得先引入、包含,我們有兩種方式引入,一個(gè)是下載jq文件,然后我們自己用 <script>標(biāo)簽引入,二個(gè)是直接使用現(xiàn)有的cdn,以上二選一即可,如下:

<html><!-- html code --><script src="local/jquery.min.js"></script><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script></body></html>2、使用JQuery封裝好的ajax

先上個(gè) JQuery手冊(cè),方便大家以后查閱JQuery庫的相關(guān)方法函數(shù)。

首先明確我們的 js 代碼要寫在哪里,推薦寫在 </body> 標(biāo)簽前即可。如下:

<html><!-- html code --><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><script>// js 代碼</script></body></html>使用ajax可以達(dá)到不刷新整個(gè)網(wǎng)頁就能跟后端交互并更新頁面內(nèi)容。那么怎么使用呢?還記得我們 score.html 頁面上有寫過的檢查表單的js代碼嗎?

<script> function checkform() { var study_name = document.getElementsByName('study_name')[0].value; var study_score = document.getElementsByName('study_score')[0].value; if ( !(study_name && study_score) ) { alert('學(xué)生姓名和學(xué)生成績不能為空'); return false; } } </script>當(dāng)姓名和成績都有的時(shí)候我們就提交表單,現(xiàn)在我們要用jq的ajax來提交表單。需要改一下代碼咯。

我們?cè)诒韱蝑iv下新增一點(diǎn)HTML代碼,用于最后后端返回的信息的展示

<div class="form"> </div> <div class="explain"> <div class="block notice">請(qǐng)輸入學(xué)生姓名和成績,點(diǎn)擊檢測(cè)評(píng)級(jí)進(jìn)行成績?cè)u(píng)級(jí)</div> </div>得到頁面如下

圖 2-1 修改后的頁面
修改表單提交屬性action,讓他提交到j(luò)s,讓js處理表單的提交,順便改下js函數(shù)名

<form action="javascript:void(0);" method="get" accept-charset="utf-8" onsubmit="return submitform()">然后修改js代碼,使用jq的ajax來處理表單提交

<script> function submitform() { // 使用jq選擇器,獲取頁面標(biāo)簽dom元素的值 var study_name = $('input[name=study_name]').val() var study_score = $('input[name=study_score]').val() // 校驗(yàn)是否已經(jīng)填寫姓名和成績,沒有的話就提示信息 if ( !(study_name && study_score) ) { // 修改提示信息出的文本顏色為紅色 $('.notice').css({color:"red"}) // 把提示信息以文本text的方式填充到notice div中 $('.notice').text('學(xué)生姓名和學(xué)生成績不能為空') // 設(shè)置提示3秒后恢復(fù)到頁面原來提示的文字和樣式 setTimeout(function(){ // 修改提示信息出的文本顏色為黑色 $('.notice').css({color:"black"}) // 把提示信息以文本text的方式填充到notice div中 $('.notice').text('請(qǐng)輸入學(xué)生姓名和成績,點(diǎn)擊檢測(cè)評(píng)級(jí)進(jìn)行成績?cè)u(píng)級(jí)') }, 3000) return false } // 如果已經(jīng)填寫了我們就通過ajax提交表單內(nèi)容 $.ajax({ url: 'http://localhost/day05/apis/scorelevel.php', // 后端php地址 data: $('form').serialize(), // 提交的數(shù)據(jù),表單直接序列化 dataType: 'text', // 返回的數(shù)據(jù)類型,我們這里直接返回文本就是text了 success: function(responseText) { // 請(qǐng)求成功的時(shí)候進(jìn)行處理 // 修改提示信息出的文本顏色為綠色 $('.notice').css({color:"green"}) // 把提示信息以文本text的方式填充到notice div中 $('.notice').text(responseText) }, error: function(err){ // 請(qǐng)求失敗的時(shí)候進(jìn)行的處理 console.log(err) } }) }</script>以上就是ajax請(qǐng)求后端的交互代碼,我們的主要重點(diǎn)放在 $.ajax() 上,其他的內(nèi)容都只是為了頁面更好看。$.ajax() 是jq封裝的異步請(qǐng)求數(shù)據(jù)的方法,她需要一個(gè)json類型的數(shù)據(jù)做參數(shù),其中只有url,請(qǐng)求地址是必須的,json數(shù)據(jù)的格式是

{ key1: value1, key2: value2}你發(fā)現(xiàn)我們傳了請(qǐng)求地址url,提交給后端的數(shù)據(jù)data,后端返回的數(shù)據(jù)格式dataType這三個(gè)參數(shù),同時(shí)也寫了兩個(gè)回調(diào)函數(shù)(就是請(qǐng)求結(jié)束時(shí)根據(jù)成功還是失敗來執(zhí)行對(duì)應(yīng)的操作),這兩個(gè)函數(shù)success和error都是jq默認(rèn)帶的回調(diào)函數(shù),我們只需要在里面做相關(guān)操作即可。當(dāng)你把以上代碼都寫完以后,請(qǐng)刷新頁面,重新去提交姓名和成績,會(huì)得到如下不會(huì)刷新頁面的結(jié)果。

圖 2-2 默認(rèn)進(jìn)來頁面的樣子
圖 2-3 沒有填寫姓名和成績時(shí)提交表單頁面的樣子
圖 2-4 填寫姓名和成績時(shí)提交表單獲得正確返回的頁面的樣子
至此,我們已經(jīng)入門了jq的 ajax 的用法,更多相關(guān)內(nèi)容希望大家可以閱讀以下jq的相關(guān)內(nèi)容和手冊(cè)。這個(gè)時(shí)候我們的頁面基本上已經(jīng)有了很好的體驗(yàn)了。ok,給你幾分鐘好好體驗(yàn)一下自己寫出來的頁面,享受這一刻的快樂吧~!

3、顯而易見的好處

這個(gè)時(shí)候,只要請(qǐng)求的后端地址不變,我們可以隨意修改后端的php代碼,只要最后按約定返回(輸出,echo)文本類型的內(nèi)容即可,不會(huì)影響到前端頁面,反過來,前端頁面你怎么改,也不會(huì)影響后端的業(yè)務(wù)邏輯(而且你已經(jīng)發(fā)現(xiàn)我們并沒有去修改后端的PHP代碼,對(duì)不對(duì))。

想象一下,如果這兩個(gè)部分代碼放一起,多難看,多難看,多難看,這個(gè)難不僅是美丑的問題,也是靈魂問題~!

OK,下課!

本文章旨在讓你了解使用JQuery AJAX與后端進(jìn)行異步頁面無刷新的交互,提升用戶體驗(yàn)和后端性能,以及前后端分離的基礎(chǔ)理解。

有問題可以留言,我會(huì)及時(shí)回復(fù)。



關(guān)鍵詞:實(shí)現(xiàn),交互,分離,入門

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉