ajax(分析ajax的使用)

1、遠古時代的ajaxphp

1.利用http協議的204特性css

設置header('HTTP/1.1 204 No Content'),當瀏覽器收到204時頁面不作跳轉html

2.利用圖片加載的特性來完成請求前端

設置src屬性,瀏覽器將會請求src對應的資源html5

hh.setAttribute('src', './01-vote.php')web

3.利用css,js加載的特完成請求,原理與加載圖片徹底同樣ajax

4.利用ifream特性json

iframe爲嵌套在頁面內的另外一個頁面,form表單的action請求路徑,method爲請求方法,target的請求名和iframe的name保持一致,則至關於請求的targe爲iframe頁面,進而實現頁面無刷新,且請求成功的需求。後端

總結:在不適用xmlHttpRequese對象的狀況下,依然能夠用jsz實現對後臺服務器的請求,同時不帶來頁面的刷新或跳轉。api

所謂ajax,是指頁面不刷新的狀況下,利用XMLHttpRequest發送http請求,也就是js的網絡化。

問題:ajax上傳文件能實現嗎?ajax上傳插件是怎麼實現的?

從http協議角度看,上傳文件,則要把文件的內容發送到服務器,若是XMLHttpRequest對象在post數據時把文件的內容也發送過去。

js讀取本地的文件內容-->XHR對象獲取要上傳的文件的內容

但瀏覽器出於安全考慮,js是不能讀取到文件內容的,因此ajax上傳文件是沒法實現的

上傳插件的實現方式:ifream,flash,html5(增長文件讀取api)

2、現代的Ajax

核心:XMLHttpRequest對象,一個專門的http請求工具(須要考慮ie瀏覽器的兼容性)

分析:

1.如何建立該對象

按標準瀏覽器,new XMLHttpRequest()便可獲得

考慮低版本ie,new ActiveXObject('Micorsoft.XMLHTTP')

2.如何利用xhr發送請求,獲取後臺服務器資源?

分析http協議,要請求須要明確這樣幾個因素:

(1)用什麼方法請求:get,post,put,delete,head

(2)請求哪一個資源:須要請求的url地址

(3)同步仍是異步?true異步,false同步

建立xhr對象:var xhr = new XMLHttpRequest()

打開鏈接:xhr.open('GET', './01-vote.php', true)

發送請求:xhr.send(null)

獲取到請求結果: alert(xhr.responseText)

3.請求的結果如何利用上?

若是爲同步,則程序表現爲2秒以後才alert,且獲取到返回值,

若是爲異步,則程序表現爲當即彈出alert框,內容是空的,但兩秒以後能夠獲取到返回值。

因此若是使用異步的話,下面的代碼繼續執行,等請求最終完成,怎麼知道這個變化?

xhr對象在請求與響應過程當中,狀態會由0-4發生變化,能夠綁定一個函數監聽狀態的變化,只要狀態發生變化就觸發某函數

xhr.onreadystatechange = function(){

console.log(this.readyState, '讀取請求過程當中的狀態0-4,4意味着請求完成')

}

若是readyState的狀態爲4且返回值responseText爲1,則可使用請求後的結果,這也是使用異步的好處

3、深度探討ajax

1.XMLHttpRequest的詳細屬性

responseText 服務器響應的主體信息

responseXML 對於大量的格式化文檔,能夠用XML來傳輸或交換,由後臺程序把數據封裝在xml文檔,js接收xml對象並解析該內容

status 服務器的返回狀態碼,200成功,403禁止,400請求語法錯誤,404未找到,5xx內部服務器錯誤

statusText 服務器返回狀態碼對應的文字描述

readyState xhr對象自身的狀態碼(0,1,2,3,4)

onreadystatechange 事件屬性,當xhr對象的狀態碼發生變化時觸發,xhr發送請求後在此方法裏經過status 和readyState 來肯定請求成功而且獲取到數據後去作一些操做

2.XMLHttpRequest的詳細方法

open('請求方式',url,同步/異步),使用post請求時請求頭必須加上Content-type和Content-length

send(),沒參數時傳null,有參數時傳‘usernam=11&email=11’這種形式的

setRequestHeader(key,value) 設置請求頭信息

getResponseHeader 獲取響應的某個頭信息

getAllResponseHeaders 獲取響應的全部頭信息

3.返回值類型

 xml類型

   普通文本:

  返回簡短的標誌字符串,如:0,1,ok

  後臺返回大段的html代碼,直接innerHTML到前端頁面

  返回json格式,再由前端去解析

  返回jsonp(跨域時使用)

    瀏覽器默認是不能跨域的,使用jsonp能夠實現跨域請求,jsonp目前沒有統一的規範,通常都是先後端約定以什麼樣的方式請求,以什麼樣的方式返回數據

    請求的url地址通常是 :‘http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=11&callback=aa’

    aa爲回調函數

    function aa(res){

      console.log(res, '請求成功後,res爲獲取到的數據')

    }

4.異步原理

  狀態值:

    0 XHR對象剛建立時

    1 open成功後爲1,此時已創建鏈接成功

    2 接收頭信息完畢

    3 接收body信息完畢後

    4 成功結束後

  同步:代碼從上往下依次執行,必須等前一個執行完後才能繼續往下執行

  異步: 代碼從上往下執行,當前執行代碼不影響後面的代碼執行,噹噹前代碼須要回調時可當即插隊到進程最前列執行

相關文章
相關標籤/搜索