JavaScript Ajax實(shí)現(xiàn)異步通信
JavaScript Ajax實(shí)現(xiàn)異步通信
一、瀏覽器與服務(wù)器的同步和異步通信
1.同步:是阻塞的,瀏覽器在向服務(wù)器發(fā)送請(qǐng)求之后一直等待服務(wù)器的響應(yīng),而沒有做其他事情。
2.異步:非阻塞的,瀏覽器向服務(wù)器發(fā)送請(qǐng)求之后,繼續(xù)執(zhí)行其他代碼,知道服務(wù)器響應(yīng),瀏覽器中斷當(dāng)前的任務(wù),處理服務(wù)器響應(yīng)。
二、沒有Ajax之前瀏覽器是通過iframe來實(shí)現(xiàn)異步刷新
1.iframe標(biāo)簽:iframe標(biāo)簽通過src連接到一個(gè)頁面,其實(shí)就是將需要實(shí)現(xiàn)異步刷新的內(nèi)容使用
iframe標(biāo)簽包裹,
A.對(duì)iframe實(shí)現(xiàn)整個(gè)頁面刷新,其實(shí)是通過刷新一個(gè)頁面的子頁面來實(shí)現(xiàn)異步刷新;
a.主頁面代碼:
<div>通過實(shí)現(xiàn)子頁面刷新來實(shí)現(xiàn)異步刷新</div> <iframe src="../testphp/data.php" frameborder="0"></iframe>
b.php頁面代碼:
<?php echo 1; ?>
B.通過在刷新子頁面的同時(shí)在子頁面做一些操作來訪問父頁面元素并且修改該元素的內(nèi)容
a.主頁面代碼:
<div id="refreshTarget"></div> <form action="../php/data.php" method="post" target="targetIframe"> <input type="submit" value="提交"> </form> <iframe name="targetIframe" frameborder="0">iframe</iframe>
b.php頁面代碼:
<?php echo 1; ?> <script type="text/javascript"> parent.document.querySelector('#refreshTarget').innerHTML = '刷新成功'; </script>
三、Ajax實(shí)現(xiàn)異步刷新
1.使用get方法來發(fā)送請(qǐng)求:
/** * 使用ajax get方式來驗(yàn)證用戶名密碼是否正確 * 1.區(qū)別于表單,我們需要自己拼接查詢字符串,不是表單提交,可 * 以不為表單添加name屬性 * 2.將數(shù)據(jù)放在查詢字符串中傳到請(qǐng)求的頁面,然后頁面獲得數(shù)據(jù)進(jìn) * 行操作,然后對(duì)前端返回響應(yīng)數(shù)據(jù),解析數(shù)據(jù),刷新 */ var submit = document.querySelector('#submit'); submit.onclick = function(){ var nameValue = document.querySelector('#username').value; var passValue = document.querySelector('#password').value; var target = document.querySelector('#refreshTarget'); /* 實(shí)例化XMLHttpResquest*/ var xhr = new XMLHttpRequest(); /* 監(jiān)控xhr對(duì)象的狀態(tài),只要xhr.readyState值改變就會(huì)觸發(fā)事件由alert彈出框的值可以知道 a.以下xhr.readyState值為4的時(shí)候表示請(qǐng)求響應(yīng)結(jié)束,數(shù)據(jù)接收完畢并且可以使用 b.xhr.status值為200表示請(qǐng)求成功 */ xhr.onreadystatechange = function() { alert(1); if(xhr.readyState == 4) { if(xhr.status == 200){ var data = xhr.responseText; if(data == 1) { target.innerHTML = '驗(yàn)證成功'; }else if(data == 2) { target.innerHTML = '驗(yàn)證失敗'; } } } } /* 打開請(qǐng)求*/ var url = '../testphp/inspector.php?username='+nameValue + '&password='+ passValue; xhr.open('get',url,true); // xhr.readyState = 1; /* 發(fā)送請(qǐng)求*/ xhr.send(null); // xhr.readyState = 2; alert(2); }
2.使用post方法來發(fā)送請(qǐng)求:
/** * 使用ajax post方式來驗(yàn)證用戶名密碼是否正確 * 1.區(qū)別于表單,我們需要自己拼接查詢字符串,不是表單提交,可 * 以不為表單添加name屬性 * 2.將數(shù)據(jù)放在查詢字符串中傳到請(qǐng)求的頁面,然后頁面獲得數(shù)據(jù)進(jìn) * 行操作,然后對(duì)前端返回響應(yīng)數(shù)據(jù),解析數(shù)據(jù),刷新 * 3.區(qū)別于ajax,get方法就是數(shù)據(jù)是放在send發(fā)送不是添加到查詢字符串 */ var submit = document.querySelector('#submit'); submit.onclick = function(){ var nameValue = document.querySelector('#username').value; var passValue = document.querySelector('#password').value; var target = document.querySelector('#refreshTarget'); /* 實(shí)例化XMLHttpResquest*/ var xhr = new XMLHttpRequest(); /* 監(jiān)控xhr對(duì)象的狀態(tài),只要xhr.readyState值改變就會(huì)觸發(fā)事件由alert彈出框的值可以知道 a.以下xhr.readyState值為4的時(shí)候表示請(qǐng)求響應(yīng)結(jié)束,數(shù)據(jù)接收完畢并且可以使用 b.xhr.status值為200表示請(qǐng)求成功 */ xhr.onreadystatechange = function() { alert(1); if(xhr.readyState == 4) { if(xhr.status == 200){ var data = xhr.responseText; if(data == 1) { target.innerHTML = '驗(yàn)證成功'; }else if(data == 2) { target.innerHTML = '驗(yàn)證失敗'; } } } } /* 打開請(qǐng)求*/ var url = '../testphp/inspector.php?'; xhr.open('post',url,true); // xhr.readyState = 1; /* 修改請(qǐng)求頭模擬from表單的post提交, a.設(shè)置Content-type可以使得在php頁面中$_POST[‘key']的方式來獲取對(duì)應(yīng)的值,不然的話必 須在$HTTP_RAW_POST_DATA對(duì)象中獲取 b.設(shè)置'Content-type'既是使用類似表單方式提交數(shù)據(jù),所以一下必須對(duì)send發(fā)送的數(shù)據(jù)序列 化為‘name=name&value=value'的形式*/ xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded'); var data = 'username='+nameValue+'&password='+passValue; /* 發(fā)送請(qǐng)求*/ xhr.send(data); // xhr.readyState = 2; }
請(qǐng)求的php頁面代碼
<?php /* 設(shè)置響應(yīng)數(shù)據(jù)的內(nèi)容格式,和字符集*/ header('Content-type:text/html;charset=utf-8'); /*使用表單的post請(qǐng)求php頁面中可以通過$_POST來獲取*/ $username = $_POST['username']; $password = $_POST['password']; if($username == 'admin' && $password == '123'){ echo 1; }else{ echo 2; } ?>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS中靜態(tài)頁面實(shí)現(xiàn)微信分享功能
小編使用ajax實(shí)現(xiàn)靜態(tài)頁面也能實(shí)現(xiàn)微信分享功能,今天小編給大家分享實(shí)現(xiàn)代碼,對(duì)js靜態(tài)頁面微信分享功能感興趣的朋友參考下本文2017-02-02javascript通過元素id和name直接取得元素的方法
這篇文章主要介紹了javascript通過元素id和name直接取得元素的方法,涉及javascript獲取元素的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04深入理解JavaScript系列(31):設(shè)計(jì)模式之代理模式詳解
這篇文章主要介紹了深入理解JavaScript系列(31):設(shè)計(jì)模式之代理模式詳解,代理模式使得代理對(duì)象控制具體對(duì)象的引用,代理幾乎可以是任何對(duì)象:文件,資源,內(nèi)存中的對(duì)象,或者是一些難以復(fù)制的東西,需要的朋友可以參考下2015-03-03模擬用戶點(diǎn)擊彈出新頁面不會(huì)被瀏覽器攔截
window.open被瀏覽器攔截導(dǎo)致頁面無法彈出,a標(biāo)簽的彈出就不會(huì)被瀏覽器攔截,下面有個(gè)不錯(cuò)的示例,大家可以學(xué)習(xí)下2014-04-04js獲取對(duì)象、數(shù)組的實(shí)際長(zhǎng)度,元素實(shí)際個(gè)數(shù)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄猨s獲取對(duì)象、數(shù)組的實(shí)際長(zhǎng)度,元素實(shí)際個(gè)數(shù)的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享 給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06JavaScript 函數(shù)參數(shù)是傳值(byVal)還是傳址(byRef) 分享
這篇文章主要介紹了在JS中函數(shù)參數(shù)是傳值(byVal)還是傳址(byRef)的誤區(qū)我們通過實(shí)例說明一下,有需要的朋友可以參考2013-07-07TypeScript之調(diào)用棧的實(shí)現(xiàn)
這篇文章主要介紹了TypeScript之調(diào)用棧的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12