日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ajax使用学习

發(fā)布時(shí)間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ajax使用学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文轉(zhuǎn)載自:http://www.jianshu.com/p/ff9e1139ea51

一、簡(jiǎn)介

1.ajax是Asynchronous Javascript and XML的縮寫,意思是執(zhí)行異步的網(wǎng)絡(luò)請(qǐng)求
2.我們會(huì)發(fā)現(xiàn)使用form表單submit按鈕提交表單的時(shí)候,網(wǎng)頁會(huì)有執(zhí)行刷新操作,在新頁面告知操作結(jié)果,而ajax技術(shù)可以使得向服務(wù)器請(qǐng)求數(shù)據(jù)的時(shí)候無需卸載頁面,得到更好的體驗(yàn)。
3.ajax的核心是XMLHttpRequest對(duì)象,它實(shí)現(xiàn)了異步方式從服務(wù)器獲取數(shù)據(jù),也就是用XHR對(duì)象獲取到服務(wù)器的數(shù)據(jù),再使用DOM將數(shù)據(jù)更新到頁面中。
4.雖然ajax名字中包含了XML,但是他只是一種通信手段,與具體數(shù)據(jù)格式?jīng)]有關(guān)系,因?yàn)楫?dāng)時(shí)主流使用XML作為前后臺(tái)通信數(shù)據(jù)的格式,所以名字中使用了XML;而現(xiàn)在主要使用的都是JSON格式的字符串

二、XMLHttpRequest對(duì)象

ajax的實(shí)現(xiàn)流程如下:
1.創(chuàng)建XHR對(duì)象
2.調(diào)用open()方法,創(chuàng)建請(qǐng)求
3.調(diào)用send()方法,發(fā)送請(qǐng)求
4.捕獲請(qǐng)求狀態(tài),判斷請(qǐng)求結(jié)果
5.獲取數(shù)據(jù)庫返回的數(shù)據(jù)

1.創(chuàng)建XHR對(duì)象
XHR對(duì)象首次實(shí)現(xiàn)是在ie5上,當(dāng)時(shí)使用的是ActiveX對(duì)象,所以XHR下ie上有兩個(gè)版本的實(shí)現(xiàn)方式,ie7以下的ActiveX對(duì)象與ie7以上的XHR對(duì)象,其余瀏覽器統(tǒng)一都是使用的XHR對(duì)象。

所以創(chuàng)建對(duì)象的時(shí)候需要有兼容性寫法

if(window.XMLHttpRequest){var request = new XMLHttpRequest(); }else{//這是ie7以下的寫法var request = new ActiveXObject("Microsoft.XMLHttp"); }

2.調(diào)用open()方法

request.open(method,url,boolean);

open()方法接收3個(gè)參數(shù):

  • method:數(shù)據(jù)提交方式,字符串形式,可以使用“get”或“post”
  • url:請(qǐng)求對(duì)象地址,字符串表示(get方式與post方式有差異)
  • boolean:true(默認(rèn))表示異步請(qǐng)求,false表示同步請(qǐng)求(相信使用ajax都是為了異步的,所以這里就用true,或者不填寫)

get方式請(qǐng)求:
使用get方式提交數(shù)據(jù)時(shí)需要將提交內(nèi)容以固定的格式附加在URL后面,格式如下:

url = "地址 ? name1=value1 & name2=value2"; //獲取到用戶名及密碼的輸入框 var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); //將輸入內(nèi)容附加在URL后面 var url = "php/get.php?username="+username.value+"&passwd="+passwd.value; //調(diào)用open()方法 request.open("get",url,true);

post方式請(qǐng)求:
使用post方式提交數(shù)據(jù),提交內(nèi)容是作為send()方法的參數(shù)提交的,所以URL后面無需附加參數(shù)。

//獲取到用戶名及密碼的輸入框 var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); //將輸入內(nèi)容附加在URL后面 var url = "php/post.php"; //調(diào)用open()方法 request.open("post",url,true);

注意:因?yàn)橐呀?jīng)不再使用form表單,所以后臺(tái)無法再使用name屬性獲取數(shù)據(jù),之前定義在form表單name屬性中的內(nèi)容現(xiàn)在就是在name1=value1中的name1中,相應(yīng)的,post方式就是下文中的postbody中的name1。

3.調(diào)用send()方法

request.send(postbody);

send()方法接收1個(gè)參數(shù):

  • postbody:字符串形式,填入需要提交的數(shù)據(jù);如果沒有提交的書,可以填入null

get方式請(qǐng)求:
因?yàn)間et方式下的數(shù)據(jù)已經(jīng)附加在URL后面提交,所以這里一般填入null

post方式請(qǐng)求:
數(shù)據(jù)的格式如下:

postbody = "name1=value1 & name2=value2"; //獲取到用戶名及密碼的輸入框 var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); //將輸入內(nèi)容附加在URL后面 var postbody = "username="+username.value+"&passwd="+passwd.value; //調(diào)用send()方法 request.send(postbody);

注意1:此處用post方式提交數(shù)據(jù)與用form表單提交畢竟有所不同,服務(wù)器會(huì)需要程序來讀取并解析原始數(shù)據(jù),所以我們需要使用XHR來模仿表單提交:

//將Content的頭部信息重新設(shè)置 //定義表單提交時(shí)的內(nèi)容類型,并以適當(dāng)類型創(chuàng)建一個(gè)字符串 request.setRequestHeader("Content-Type","application/x-www/form-unencoded");

注意2:這個(gè)方法只能加載open()方法之后,send()方法之前。

//實(shí)際使用方法 var username = document.getElementById("username"); var passwd = document.getElementById("passwd");var url = "php/post.php"; request.open("post",url,true);//放置的位置一定在這里 request.setRequestHeader("Content-Type","application/x-www/form-unencoded");var postbody = "username="+username.value+"&passwd="+passwd.value; request.send(postbody);

4.捕獲請(qǐng)求狀態(tài),判斷結(jié)果
send()方法調(diào)用后,請(qǐng)求就會(huì)被提交到服務(wù)器;多數(shù)情況下,我們會(huì)發(fā)送異步請(qǐng)求先檢查請(qǐng)求過程當(dāng)前的活動(dòng)階段,再判斷請(qǐng)求是否返回成功。

XHR對(duì)象相關(guān)屬性:

  • readyState:請(qǐng)求/響應(yīng)過程的當(dāng)前活動(dòng)階段
  • responseText:作為響應(yīng)主體被返回的文本
  • responseXML:如果響應(yīng)的內(nèi)容類型是text/xml或者application這個(gè)屬性中將保存著響應(yīng)數(shù)據(jù)的XMLDOM文檔
  • status:響應(yīng)的HTTP狀態(tài)
  • statusText:Http狀態(tài)說明

我們利用原生的onreadystatechange事件來監(jiān)聽readyState變化。
readyState返回值如下:

只要readyState的值有一個(gè)值變?yōu)榱硪粋€(gè)值,就會(huì)觸發(fā)一次onreadystatechange事件,可以利用此事件來返回監(jiān)聽到的請(qǐng)求/響應(yīng)過程狀態(tài)值。

我們關(guān)心的是readyState值為4的情況,因?yàn)檫@是代表所有數(shù)據(jù)已經(jīng)準(zhǔn)備就緒;同時(shí)如果status返回的是200,那么可以確定該次請(qǐng)求/響應(yīng)過程全部完成

status返回值如下:

注意:這里不要使用statusText去判斷,因?yàn)樵撝翟诳鐬g覽器時(shí)不可靠

最后的返回結(jié)果,不管是什么類型內(nèi)容,都會(huì)保存在responseText中

監(jiān)聽代碼如下:

//監(jiān)聽readyState狀態(tài)與status返回值 request.onreadystatechange = function () {if(request.readyState == 4 && request.status == 200){alert(request.responseText);} }

綜上所述的內(nèi)容,就是整個(gè)ajax請(qǐng)求的全部流程,我們?cè)趈s中最后拿到的就是后臺(tái)返回的responseText,這里面保存的一般來說是JSON格式的字符串,我們可以將其轉(zhuǎn)換成數(shù)組或者對(duì)象后提取其中的鍵值對(duì)。

三、封裝使用

一下代碼是將上述的過程進(jìn)行的封裝,使得使用時(shí)只要調(diào)用函數(shù)并在回調(diào)函數(shù)中實(shí)現(xiàn)功能就可以了。

<script> /** method是請(qǐng)求方式* url是網(wǎng)絡(luò)請(qǐng)求的地址* postboidy是post方式請(qǐng)求時(shí)的提交數(shù)據(jù)* successCallback是請(qǐng)求成功的函數(shù)* errorCallback是請(qǐng)求失敗的函數(shù) */function request (method,url,postbody,successCallback,errorCallback) {//創(chuàng)建一個(gè)請(qǐng)求對(duì)象if(window.XMLHttpRequest){var request = new XMLHttpRequest();}else{var request = new ActiveXObject("Microsoft.XMLHttp");}if(arguments[0]=="POST"){//創(chuàng)建請(qǐng)求request.open(method,url,true);//設(shè)置上傳類型request.setRequestHeader("content-type","application/x-www-form-urlencoded");}else if(arguments[0]=="GET"){request.open(method,url,true);}//發(fā)送請(qǐng)求request.send(postbody);//狀態(tài)監(jiān)聽request.onreadystatechange = function () {if(request.readyState ==4 && request.status == 200){//請(qǐng)求成功的回調(diào)函數(shù)if(successCallback){successCallback(request.responseText);}} else if (request.readyState == 4 && request.status != 200) {//請(qǐng)求失敗的回調(diào)函數(shù)if(errorCallback){errorCallback(request.statusText);}}} } </script>

使用方法舉例:
下面定義了一個(gè)簡(jiǎn)單的表單提交用戶名和密碼,使用回調(diào)函數(shù)拿到后臺(tái)返回的JSON串后,轉(zhuǎn)換成對(duì)象再取出其中的信息,告知用戶是登陸成功還是失敗。

//html部分 //調(diào)用封裝好的函數(shù) <script src="request.js"></script> <div class="form"><input type="text" id="username"><input type="password" id="passwd"><button id="loginBtn">登錄</button> </div>//js部分 <script> var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); var loginBtn = document.getElementById("loginBtn") loginBtn.onclick = function () {//設(shè)置請(qǐng)求地址及提交內(nèi)容var url = "login.php";var postbody = "username="+username.value+"&passwd="+passwd.value;//發(fā)起ajax請(qǐng)求,并使用回調(diào)函數(shù)實(shí)現(xiàn)功能request("POST",url,postbody,function (resText) {//把json格式的字符串轉(zhuǎn)換成對(duì)象var obj = JSON.parse(resText);alert(obj.msg);}); } </script>//php部分login.php <?php //從請(qǐng)求中獲取用戶名和密碼$username = $_POST["username"];$passwd = $_POST["passwd"];//連接服務(wù)器@$mysqli = new mysqli("localhost","root","","user");$mysqli->query("set names utf8");//查詢語句$sql = "SELECT * FROM user WHERE username='$username' AND passwd='$passwd'";//數(shù)據(jù)庫執(zhí)行查詢$result = $mysqli->query($sql);//判斷查詢結(jié)果是否有值,并定義返回字符串//echo出來的就是返回前端的數(shù)據(jù)if($result->num_rows > 0){echo '{"errorcode":0,"msg":"登陸成功"}';}else{echo '{"errorcode":1,"msg":"用戶名或密碼錯(cuò)誤"}';}//關(guān)閉服務(wù)器$mysqli->close(); ?>

總結(jié)

以上是生活随笔為你收集整理的Ajax使用学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。