本文主要總結整理Ajax使用方法背景知識點的詳細解析,以及Ajax跨域的具體使用方式而且對栗子進行了講解,須要的朋友能夠過來參考下,喜歡的能夠點波贊,或者關注一下本人,但願經過本文可以做爲一個Ajax的查找資料,不懂Ajax?看這篇文章就能夠了。javascript
Ajax的工做原理至關於在用戶和服務器之間加了一箇中間層(Ajax引擎),使用戶操做與服務器響應異步化。並非全部的用戶請求都提交給服務器,像—些數據驗證(好比判斷用戶是否輸入了數據)和數據處理(好比判斷用戶輸入數據是不是數字)等都交給Ajax引擎本身來作, 只有肯定須要從服務器讀取新數據時再由Ajax引擎代爲向服務器提交請求。把這些交給了Ajax引擎,用戶操做起來也就感受更加流暢了。php
頁面無刷新,用戶體驗好。html
異步通訊,更加快的響應能力。前端
減小冗餘請求,減輕了服務器負擔java
基於標準化的並被普遍支持的技術,不須要下載插件或者小程序ajax
javascript同步表示sync,指的就是:代碼依次執行。javascript 異步表示async,指:代碼執行不按順序,能夠這麼理解:同步是在一條直線上的隊列,異步不在一個隊列上 各走各的。javascript所謂的「線程」,就是這樣的一種概念。小程序
雖然異步執行能夠實現多任務並行執行,使執行的效率大大提升,可是異步執行也會佔用瀏覽器的性能,不要胡亂的使用異步執行。後端
舉個栗子:在負荷很重的客戶/服務器系 統中,時間延遲頻繁且漫長,在這種環境下就比較適宜宜採用異步執行模式。跨域
關於同步和異步,大概只能說這些,有興趣的朋友能夠本身深刻了解一下。瀏覽器
Ajax的核心是XMLHttpRequest對象,它是Ajax實現的關鍵,發送異步請求、接受響應以及執行回調都是經過它來完成,下面咱們就來聊一聊XMLHttpRequest對象是什麼鬼?擁有哪些屬性、方法,這些都是用來幹什麼的,這對於咱們系統性的瞭解Ajax請求是很是有幫助的。
XMLHttpRequest雖然目前尚未被W3C所採納,可是它已是一個事實的標準,由於全部現代瀏覽器(IE7+、Firefox、Chrome、Safari 以及 Opera)均支持 XMLHttpRequest 對象。,XMLHttpRequest對象的使用方式極其簡單,先不要懵逼。繼續往下看。
在先後端分離的狀況下,對於前端的小夥伴來講,通常是後端選擇請求接口,請求方式,讓咱們去使用,因此請求方式的選擇這點,稍微瞭解一下便可。
關於http的狀態碼還有很是多,不止上圖這點這麼簡單,有興趣的能夠看本人以前寫的一篇文章:http狀態碼詳解。
function loadXMLDoc()
{//點擊事件
var xmlhttp;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 瀏覽器執行代碼
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//一、上面是建立XMLHttpRequest對象
xmlhttp.open("POST","/try/Ajax/demo_post2.php",true);// 二、open方法表示初始化請求,此時並無發送。
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Henry&lname=Ford");//四、發送請求
xmlhttp.onreadystatechange=function();
{//三、當參數被傳入服務器的時候,引用監聽事件。
if (xmlhttp.readyState==4 && xmlhttp.status==200)
//判斷readyState四種狀態,當執行四步完成以後,而且返回的是200(成功)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
}
複製代碼
XMLHttpRequest對象在上文介紹了他的屬性和方法,如上所述, Ajax的核心是XMLHttpRequest對象,這一步是必不可少的,下面就是它的使用語法。
var xmlhttp = new XMLHttpRequest();//沒看錯,就是這麼簡單
複製代碼
XMLHttpRequest對象是IE7纔開始支持的,老版本IE5和IE6使用的是ActiveX 對象,使用方式是同樣的,區別在於要建立不一樣的對象。IE7以上自帶XMLHttpRequest對象,若是要兼容IE5和IE6只需判斷瀏覽器中是否存在XMLHttpRequest對象。
var xmlhttp;
if (window.XMLHttpRequest)//檢查是否有XMLHttpRequest對象
{
// IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 瀏覽器執行代碼
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
複製代碼
open方法的語法open(method,url,async)
觸發Ajax的時候,XMLHttpRequest 的狀態會不斷變化,這個值就存在readyState屬性中。
readyState只有5個值{0,1,2,3,4},只讀不能寫。
0: XMLHttpRequest對象建立完成。————尚未調用open()方法
1: XMLHttpRequest對象初始化完成。————open() 方法已調用,可是 send()方法未調用。請求尚未被髮送。
2: 請求已經發送。———Send() 方法已調用,HTTP 請求已發送到 Web 服務器。未接收到響應。
3: 服務器已經返回了數據(可是尚未被解析,可能只一段http報文)。————正在解析響應內容
4: 數據解析已經完成。————響應內容解析完成,能夠在客戶端調用了
數據解析完成以後會返回一個http的狀態碼,經過XMLHttpRequest.status得到該值,判斷是否爲200,判斷是否請求成功。
每當readyState屬性值改變時,就會觸發 onreadystatechange 事件。——經過監聽onreadystatechange事件,來判斷請求的狀態。
get:
xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
xmlhttp.send();
複製代碼
post:
xmlhttp.open("POST","/try/ajax/demo_post2.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Henry&lname=Ford");
複製代碼
想到當初本身不會Ajax的時候,畏Ajax如洪水猛獸,但願小夥伴們,看了本文就能寫出本身的第一個Ajax來,這也是我想寫這篇文章的意義所在。十多天沒寫文了,這篇文章也準備了好幾天,寫的很差以後,歡迎指正,謝謝。
最後:如需轉載,請放上原文連接並署名。碼字不易,感謝支持!由於我常常看不懂別人寫的分享,因此我的寫文比較偏小白,寫的很差之處,歡迎指點。而後就是但願看完的朋友點個喜歡,也能夠關注一下我。
以上。2017.6.1