摘要:隨后也跟進(jìn)抄襲了,取名,并被納入規(guī)范全稱翻譯成中文異步的和技術(shù)的核心是對(duì)象簡(jiǎn)稱,可以在不刷新頁(yè)面頁(yè)面也能取得新的數(shù)據(jù)。注意請(qǐng)求和響應(yīng)都不包含信息。
JSONP發(fā)展
了解了JSONP技術(shù)棧后,知道了JSONP是AJAX出現(xiàn)之前后端交互最好的解決方案,但它依然沒解決問題,用JSONP只能發(fā)送GET請(qǐng)求,不能發(fā)其他請(qǐng)求
form表單可以發(fā)GET請(qǐng)求,也可以發(fā)POST請(qǐng)求,POST請(qǐng)求沒有請(qǐng)求參數(shù),但是會(huì)刷新頁(yè)面或新開頁(yè)面
a標(biāo)簽可以發(fā)GET請(qǐng)求,會(huì)刷新頁(yè)面或新開頁(yè)面
img標(biāo)簽可以發(fā)GET請(qǐng)求,只能以圖片方式展示
let image = document.createElement("img") img.src = "/xxx" imgae.onload = () => {} imgae.onerror = () => {}
link可以發(fā)GET請(qǐng)求,但是只能以CSS、favicon的形式展示
let link = document.createElement("link") link.src = "/xxx" document.head.appendChild(link) link.onload = () => {} link.onerror = () => {}
用script可以發(fā)GET請(qǐng)求,但是只能以腳本的形式運(yùn)行
let script = document.createElement("script") script.src = "/xxx" document.body.appendChild(script) script.onload = () => {} script.onerror = () => {}
有沒有什么方式可以實(shí)現(xiàn)
get、post、put、delete請(qǐng)求都行
想以什么形式展示就以什么形式展示
微軟的突破
IE 5 率先在 JS 中引入 ActiveX 對(duì)象(API),使得 JS 可以直接發(fā)起 HTTP 請(qǐng)求。
隨后 Mozilla、 Safari、 Opera 也跟進(jìn)(抄襲)了,取名 XMLHttpRequest,并被納入 W3C 規(guī)范
AJAX 全稱 Async Javascript and XML 翻譯成中文:異步的 JavaScript 和 XML
Ajax 技術(shù)的核心是 XMLHttpRequest 對(duì)象(簡(jiǎn)稱:XHR),可以在不刷新頁(yè)面頁(yè)面也能取得新的數(shù)據(jù)。
滿足下面的條件就是AJAX
使用 XMLHttpReques 發(fā)請(qǐng)求
服務(wù)器返回 XML 格式的字符串
JS 解析 XML,并更新局部頁(yè)面
XMLHttpRequest 的用法使用 XMLHttpRequest 三步驟:
要用 XMLHttpRequest 構(gòu)造一個(gè)對(duì)象
調(diào)用 open() 方法
調(diào)用 send() 方法
open() 方法接收三個(gè)參數(shù):請(qǐng)求類型,請(qǐng)求 url,是否使用異步;
send() 方法接受一個(gè)參數(shù):請(qǐng)求主體發(fā)送的數(shù)據(jù)。
這個(gè)請(qǐng)求是同步的,瀏覽器會(huì)等到服務(wù)器響應(yīng)之后繼續(xù)執(zhí)行,響應(yīng)之后的相關(guān)屬性:
responseText:響應(yīng)主體返回的文本
status:響應(yīng)的 HTTP 狀態(tài)
statusText:響應(yīng)的 HTTP 狀態(tài)說明
在接收到響應(yīng)后,應(yīng)該這樣檢查兩種狀態(tài)
let request = new XMLHttpRequest() request.onreadystatechange = function(e){ if(request.status >= 200 && request.status < 300 || request.status === 304){ console.log(request.responseText) }else if(request.status >=400){ console.log("錯(cuò)誤信息:" + request.status) } } request.open("POST","http://jack.com:8889/xxx") request.send()
大多數(shù)情況下,我們使用的是異步請(qǐng)求,才能 JS 繼續(xù)執(zhí)行,不必等待響應(yīng),此時(shí)應(yīng)該檢查readyState,這個(gè)屬性有5種取值:
值 | 狀態(tài) | 描述 |
---|---|---|
0 | UNSENT(未打開) | open()方法還未被調(diào)用 |
1 | OPENED(未發(fā)送) | send()方法還未被調(diào)用 |
2 | HEADERS_RECEIVED(以獲取響應(yīng)頭) | send()方法已經(jīng)被調(diào)用,響應(yīng)頭和響應(yīng)狀態(tài)已經(jīng)返回 |
3 | LOADING(正在下載響應(yīng)體) | 響應(yīng)體下載中;responseText中已經(jīng)獲取部分?jǐn)?shù)據(jù) |
4 | DONE(請(qǐng)求完成) | 整個(gè)請(qǐng)求過程已完畢 |
只要readyState屬性值一變化,就會(huì)觸發(fā)一次readystatechange事件,可以利用這個(gè)事件來檢測(cè)每次狀態(tài)變化后的readystate的屬性值,通常我們只對(duì)readystate值為4進(jìn)行檢測(cè)。
let request = new XMLHttpRequest() request.onreadystatechange = function(e){ if(request.readyState === 4){ if(request.status >= 200 && request.status <= 300){ console.log(request.responseText) }else if(request.status >=400){ console.log("錯(cuò)誤信息:" + request.status) } } } request.open("POST","http://jack.com:8889/xxx") request.send()
響應(yīng)返回的requestText永遠(yuǎn)是字符串,早期使用的符合 XML 格式的字符串,現(xiàn)在使用的是符合 JSON 語(yǔ)法的字符串,前端拿到后可以用window.JSON.parse()來解析
具體來看一個(gè)例子:點(diǎn)擊按鈕發(fā)送一個(gè) POST 請(qǐng)求
myButton.addEventListener("click",function(){ let request = new XMLHttpRequest() request.onreadystatechange = function(){ //盡量往上放,不會(huì)錯(cuò)過任何一個(gè)狀態(tài),放在下面的話會(huì)錯(cuò)過之前的狀態(tài) console.log(request.readyState) if(request.readyState === 4){ //請(qǐng)求完成 if(request.status === 200){ //請(qǐng)求成功 let string = request.responseText //把符合 JSON 語(yǔ)法的String 轉(zhuǎn)換成 JS 對(duì)應(yīng)的 Object let object = window.JSON.parse(string) //JSON.parse 是瀏覽器提供的,json3.js是著名的就是寫JSON.parse的 }else if(request.status === 400){ //請(qǐng)求失敗 console.log("錯(cuò)誤信息:" + request.status) } } } request.open("POST","http://jack.com:8889/xxx") //配置 request request.send() })
服務(wù)器上面就要這樣寫
if(path === "/xxx" && method === "POST"){ response.setHeader("Content-Type","text/json;charset=utf-8") response.write(` //JSON語(yǔ)法 { //Http第四部永遠(yuǎn)是 String,這里是符合 JSON 語(yǔ)法的 String,不是 Object "note":{ "to":"張三", "from":"李四", "heading":"打招呼", "content":"hi" } } `) }JavaScript 和 JSON 語(yǔ)法的不同之處
JS | JSON |
---|---|
undefined | 沒有 |
null | null |
["a","b"] | ["a","b"] |
function{} | 沒有 |
{name:"frank"} | {"name":"frank"} |
"frank" | "frank" |
var a = {};a.self = a | 搞不定(沒有變量) |
{__proto__} | 沒有原型鏈 |
Ajax 通信只能訪問同一個(gè)域下的資源,簡(jiǎn)單的說如果不是同一個(gè)網(wǎng)站,不能送 AJAX 請(qǐng)求,它是狀態(tài)碼status為0。
只有協(xié)議+端口+域名一模一樣才允許發(fā) AJAX 請(qǐng)求
因?yàn)?AJAX 可以讀取響應(yīng)內(nèi)容,因此瀏覽器不允許你這樣做
有時(shí)也需要合理的跨域請(qǐng)求,有兩種方法:
SRJ方案
CORS方案
SRJ 方案之前已經(jīng)講過了,這里不在重復(fù),可以看:JSONP技術(shù)棧
這里講解一個(gè) CORS(Cross-Origin Resource Sharing,跨域源資源共享),基本思想就是使用自定義的 HTTP 響應(yīng)頭:
在服務(wù)器上,共享的資源加上響應(yīng)頭response.setHeader("Access-Control-Allow-Origin","http://jack.com:8889")就可以了。
如果沒有這個(gè)頭部,或者有這個(gè)信息但源信息不匹配,請(qǐng)求還是成功,但服務(wù)器給的響應(yīng)沒有響應(yīng)體(第四部分)。注意:請(qǐng)求和響應(yīng)都不包含 Cookie 信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/107795.html
摘要:如果我們假設(shè)文件和文件位于相同的目錄,那么代碼是這樣的其他方法如下編程步驟創(chuàng)建對(duì)象設(shè)置請(qǐng)求方式調(diào)用回調(diào)函數(shù)發(fā)送請(qǐng)求處理返回的結(jié)果創(chuàng)建對(duì)象一般來說手寫的時(shí)候,首先需要判斷該瀏覽器是否支持對(duì)象,如果支持則創(chuàng)建該對(duì)象,如果不支持則創(chuàng)建對(duì)象。 Ajax的簡(jiǎn)介 什么是Ajax AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)...
摘要:如果我們假設(shè)文件和文件位于相同的目錄,那么代碼是這樣的其他方法如下編程步驟創(chuàng)建對(duì)象設(shè)置請(qǐng)求方式調(diào)用回調(diào)函數(shù)發(fā)送請(qǐng)求處理返回的結(jié)果創(chuàng)建對(duì)象一般來說手寫的時(shí)候,首先需要判斷該瀏覽器是否支持對(duì)象,如果支持則創(chuàng)建該對(duì)象,如果不支持則創(chuàng)建對(duì)象。 Ajax的簡(jiǎn)介 什么是Ajax AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)...
摘要:在接收響應(yīng)期間持續(xù)不斷地觸發(fā)。在請(qǐng)求發(fā)生錯(cuò)誤時(shí)觸發(fā)。在通信完成或者觸發(fā)或事件后觸發(fā)。已經(jīng)接收到部分響應(yīng)數(shù)據(jù)。基于標(biāo)準(zhǔn)被廣泛支持。破壞程序的異常處理機(jī)制。 原文(我的GitHub):https://github.com/liangfengbo/frontend-ability/issues/1 學(xué)習(xí)大綱 理解Ajax的工作原理 Ajax核心-XMLHttpRequest對(duì)象 封裝Aja...
摘要:關(guān)于,強(qiáng)烈推薦閱讀跨域資源共享詳解阮一峰另外,這里也整理了一個(gè)實(shí)現(xiàn)原理圖簡(jiǎn)化版如何判斷是否是簡(jiǎn)單請(qǐng)求瀏覽器將請(qǐng)求分成兩類簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求。 前言 從剛接觸前端開發(fā)起,跨域這個(gè)詞就一直以很高的頻率在身邊重復(fù)出現(xiàn),一直到現(xiàn)在,已經(jīng)調(diào)試過N個(gè)跨域相關(guān)的問題了,16年時(shí)也整理過一篇相關(guān)文章,但是感覺還是差了點(diǎn)什么,于是現(xiàn)在重新梳理了一下。 個(gè)人見識(shí)有限,如有差錯(cuò),請(qǐng)多多見諒,歡迎提出iss...
摘要:實(shí)現(xiàn)跨域的原理通過方式請(qǐng)求載入并執(zhí)行一個(gè)文件,相當(dāng)于通過的形式的導(dǎo)入一個(gè)外部的方法語(yǔ)法該函數(shù)是簡(jiǎn)寫的函數(shù),等價(jià)于在中,您可以通過使用形式的回調(diào)函數(shù)來加載其他網(wǎng)域的數(shù)據(jù),如。將自動(dòng)替換為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。 更多詳情見http://blog.zhangbing.club/Ja... 最近在項(xiàng)目開發(fā)的過程中遇到一些Javascript 跨域請(qǐng)求的問題,今天抽空對(duì)其進(jìn)行總結(jié)一下,以...
閱讀 3672·2021-09-22 15:28
閱讀 1296·2021-09-03 10:35
閱讀 878·2021-09-02 15:21
閱讀 3474·2019-08-30 15:53
閱讀 3496·2019-08-29 17:25
閱讀 569·2019-08-29 13:22
閱讀 1555·2019-08-28 18:15
閱讀 2286·2019-08-26 13:57