1、什麼是Ajax?
AJAX=Asynchornous Javascript and XML(異步的javascript和xml)
AJAX是一種無需從新加載整個頁面而實現部分更新的網頁技術。加強B/S的體驗性。
頁面部分刷新示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>僞造ajax</title>
</head>
<script>
window.onload=function f(){
var myDate=new Date();
document.getElementById("currentTime").innerText=myDate.getTime();
}
function loadPage(){
var targetURL=document.getElementById("url").value;
targetURL="http://"+targetURL;
console.log(targetURL);
document.getElementById("iframePosition").src=targetURL;
}
</script>
<body>
<div>
<p>請輸入要加載的地址<span id="currentTime"></span></p>
<p>
<input type="text" id="url" value="www.baidu.com">
<input type="button" value="提交" onclick="loadPage()">
</p>
</div>
<div>
<h3>
加載頁面的位置
</h3>
<iframe style="width:100%;height:500px;" id="iframePosition" >
</iframe>
</div>
</body>
</html>
複製代碼
頁面顯示效果:
點擊提交後效果:
在AJAX出現以前,像這種利用iframe實現頁面部分刷新的方式是主流,這種方式有以下缺點:
1.如腳本/樣式的額外鏈入增長了請求,天然就增長了時間開銷。
2.引入頁面會擠佔頁面控件,而更多的滾動條出如今頁面上也會是頁面顯得更加混亂。
3.iframe會阻塞頁面onload事件,使加載變得緩慢。
4.對鏈接的影響,通常頁面默認會有限定的鏈接次數,iframe佔用了這些鏈接,而iframe顯示的內容每每又不那麼重要。
2、簡單的原生ajax
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<style>
*{
margin:5px 0 0 5px;
padding:0;
}
table{
width:500px;
text-align: center;
border-collapse: collapse;
}
td{
border:1px solid black;
}
</style>
<body>
<div>
<p>status:<span id="A1"></span></p>
<p>statusText:<span id="A2"></span></p>
<p>responseText:<span id="A3"></span></p>
<p>readyStatet:<span id="A4"></span></p>
<button onclick="change('data.json')">change</button>
</div>
<table>
<th>
<tr>
<td>姓名</td>
<td>性別</td>
<td>郵箱</td>
<td>年齡</td>
</tr>
<tbody id="myTBody">
</tbody>
</th>
</table>
</body>
<script>
function change(url){
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("get",url,true); //get是請求方式 url是請求地址 true開啓異步
xmlhttp.send();
console.log(xmlhttp.status);
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){ //請求成功時
A4.innerHTML=xmlhttp.readyState;
document.getElementById("A1").innerHTML=this.status;
document.getElementById("A2").innerHTML=this.statusText;
document.getElementById("A3").innerHTML=this.responseText;
var obj=JSON.parse(this.responseText);
addChilds(obj);
}else{ //請求失敗時
document.getElementById("A1").innerHTML=this.status;
document.getElementById("A2").innerHTML=this.statusText;
document.getElementById("A3").innerText="請求失敗";
} //當請求狀態發生變化時調用state_change方法
}
}
function addChilds(obj){
for(var i=0;i<obj.length;i++){
var myTBody=document.getElementById("myTBody");
var oTr=document.createElement("tr");
Object.keys(obj[i]).forEach(key=>{
var oTd=document.createElement("td");
console.log(obj[i][key]);
oTd.innerHTML=obj[i][key];
oTr.appendChild(oTd);
});
myTBody.appendChild(oTr);
}
}
</script>
</html>
複製代碼
這裏爲了模擬實際場景,我手動建立了一個簡單的data.json文件,內容以下。
[
{
"name":"張國立",
"sex":"男",
"email":"zhangguoli@123.com",
"age":36
},
{
"name":"張鐵林",
"sex":"男",
"email":"zhangtieli@123.com",
"age":23
},
{
"name":"鄧婕",
"sex":"女",
"email":"zhenjie@123.com",
"age":29
},
{
"name":"張國立",
"sex":"男",
"email":"zhangguoli@123.com",
"age":23
},
{
"name":"張鐵林",
"sex":"男",
"email":"zhangtieli@123.com",
"age":26
},
{
"name":"鄧婕",
"sex":"女",
"email":"zhenjie@123.com",
"age":24
}
]
複製代碼
當點擊按鈕時,就會觸發已經寫好的事件函數,函數內建立了咱們的ajax實例,它會在服務器上找到data.json文件,再經過JSON.parse將json字符串轉化爲咱們可以使用的javascript對象,html中的表格是咱們裝載數據的容器,咱們得到的json數據通過轉換後,就用數組遍歷找出每個對象,每次遍歷時先建立一個新元素tr,每個對象再用keys方法遍歷出他們的屬性名,再經過forEach方法建立td元素,最後將td放進已經建立好的tr元素中,再將tr放進table。這裏文字描述可能不清晰,建議直接讀代碼更直觀一些。
有一點很重要,要進行這個簡單的ajax實踐的話,必須是有配置服務器的,能夠將本機配置成服務器,也可使用別處服務器的接口,github上應該有相關的json文件接口。
效果展現
3、小結
在ajax出現以前,使用iframe是以犧牲性能和頁面的美觀爲前提的,ajax的出現解決了這個痛點,爲先後端的數據交互提供了一個新的更快捷也更理想的方式。
Ajax最大的優勢就是能在不刷新整個頁面的狀況下維持與服務器通訊,其次,它還能使用異步的方式與服務器通訊,不打斷用戶的操做;在先後端負載均衡上,它將一些後端的工做移到前端,減小服務器與寬帶的負擔,同時ajax也使得頁面與應用分離,也就是數據與呈現相互分離。
儘管ajax看起來這麼的完美,但實際上它仍然有許多的不足: 1. 瀏覽器對XMLHttpRequest對象的支持度不足,Ajax的不足之一首先來自與瀏覽器,Integer Explorer 在5.0及之後的版本才支持 XMLHttpRequest 對象(現階段大部分客戶端上的IE瀏覽器是IE6及以上),Mozilla,NetScape 等瀏覽器支持XMLHttpRequest則在更後,爲了使得Ajax 應用能在各大瀏覽器中正常運行,程序員必須花費大量的精力編碼以兼顧各大瀏覽器之間的差異。 2. 破壞瀏覽器前進,「」後退「」按鈕的正常功能,在傳統的網頁中,用戶常常會習慣性的使用瀏覽器自帶的「前進」,「後退」按鈕,然而Ajax改變了此Web瀏覽習慣。在Ajax中 前進,後退按鈕都會失效。 雖然經過必定的方法(添加苗店) 來使得用戶可使用「前進」,「後退」按鈕,但相對於傳統方法卻麻煩不少。 3. 對搜索引擎的支持度不足,對於搜索引擎也是支持Ajax的一項缺憾。一般搜索引擎都是經過爬蟲程序來對互聯網上的數以及萬的海量數據來進行分析,而衆所周知javascriptd對搜索引擎的支持很不友好,ajax又是用javascript編寫的,結果可想而知。 4. 開發和調試工具的缺少,ajax是用javascript編寫的,在目前,因爲缺乏很好的javascript開發和調試工具,使不少Web開發者對javaScript 望而生畏,這對於編寫Ajax 代碼更加困難了。