成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

理解AJAX

wanglu1209 / 1875人閱讀

摘要:在這個(gè)例子中,處理函數(shù)為。保證這些方法一定要是大寫字母,否則其他一些瀏覽器比如可能無法處理這個(gè)請(qǐng)求。要重點(diǎn)提到的就是請(qǐng)求返回的是一個(gè),所以對(duì)獲取數(shù)據(jù)處理要用。

先參考MDN的什么是AJAX
AJAX是異步的JavaScript和XML(Asynchronous JavaScript And XML)。簡(jiǎn)單點(diǎn)說,就是使用 XMLHttpRequest 對(duì)象與服務(wù)器通信。 它可以使用JSON,XML,HTML和text文本等格式發(fā)送和接收數(shù)據(jù)。AJAX最吸引人的就是它的“異步”特性,也就是說他可以在不重新刷新頁面的情況下與服務(wù)器通信,交換數(shù)據(jù),或更新頁面。

使用AJAX的兩個(gè)特性

在不重新加載頁面的情況下發(fā)送請(qǐng)求給服務(wù)器。

接受并使用從服務(wù)器發(fā)來的數(shù)據(jù)。

AJAX請(qǐng)求過程是什么樣的 先看代碼
function request(){
    let httpRequest = new XMLHttpRequest();
    //要在函數(shù)閉包內(nèi)創(chuàng)建XHR變量,避免被其他request相互覆蓋;
    if(!httpRequest){
        alert("Giving up :( Cannot create an XMLHTTP instance");
        return false;
    }

    httpRequest.onreadystatechange = alertContents;
    httpRequest.open("GET", "test.html");
    httpRequest.send();
}

function alertContents() {
    if (httpRequest.readyState === XMLHttpRequest.DONE) {
      if (httpRequest.status === 200) {
        alert(httpRequest.responseText);
      } else {
        alert("There was a problem with the request.");
      }
    }
  }
創(chuàng)建XMLHttpRequest對(duì)象
let httpRequest = new XMLHttpRequest();
什么是onreadystatechange

只要 readyState 屬性發(fā)生變化,就會(huì)調(diào)用相應(yīng)的處理函數(shù)。

在這個(gè)例子中,處理函數(shù)為alertContents。要注意的是,函數(shù)名后沒有參數(shù),因?yàn)槟惆岩粋€(gè)引用賦值給了函數(shù),而不是真正的調(diào)用了它。下面會(huì)講關(guān)于這個(gè)處理函數(shù)的具體實(shí)現(xiàn)。

還有onload()

onreadystatechange顧名思義,每次state變化的時(shí)候都會(huì)調(diào)用被給的函數(shù),如果只想在狀態(tài)為完成的時(shí)候被調(diào)用,可以使用onload來代替。

open() 初始化

不管get還是post,都要先open()。

第一個(gè)參數(shù)是HTTP請(qǐng)求方法 - 有GET,POST,HEAD以及服務(wù)器支持的其他方法。 保證這些方法一定要是大寫字母,否則其他一些瀏覽器(比如FireFox)可能無法處理這個(gè)請(qǐng)求。

第二個(gè)參數(shù)是你要發(fā)送的URL。由于安全原因,默認(rèn)不能調(diào)用第三方URL域名。 確保你在頁面中使用的是正確的域名,否則在調(diào)用 open() 方法是會(huì)有 “權(quán)限被拒絕” 錯(cuò)誤提示。一個(gè)容易犯的錯(cuò)誤是你企圖通過 domain.tld 訪問網(wǎng)站,而不是使用 www.domain.tld。

第三個(gè)參數(shù)是可選的,用于設(shè)置請(qǐng)求是否是異步的。如果設(shè)為 true (默認(rèn)設(shè)置),JavaScript執(zhí)行會(huì)持續(xù),并且在服務(wù)器還沒有響應(yīng)的情況下與頁面進(jìn)行交互。

send() 發(fā)送

上面的就是一個(gè)get情景中,用send()的例子

再提供一個(gè)post例子

post要設(shè)定相應(yīng)的request header,調(diào)用setRequestHeader()

var xhr = new XMLHttpRequest();
xhr.open("POST", "/server", true);

//如果要post就要設(shè)定相應(yīng)的request header
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xhr.onreadystatechange = function() { //這里定義onreadystatechange前面已經(jīng)講過了
    if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
        // 請(qǐng)求完畢,做一些處理
    }
}
xhr.send("foo=bar&lorem=ipsum");//正式發(fā)送的send()調(diào)用
處理onreadystatechange的函數(shù)實(shí)現(xiàn)

我們知道會(huì)把一個(gè)函數(shù)賦予xhr.onreadystatechange。那么這個(gè)函數(shù)應(yīng)該做什么?

首先,函數(shù)要檢查請(qǐng)求的狀態(tài)。如果狀態(tài)的值是 XMLHttpRequest.DONE (對(duì)應(yīng)的值是4),意味著服務(wù)器響應(yīng)收到了并且是沒問題的,然后就可以繼續(xù)執(zhí)行。

if (httpRequest.readyState === XMLHttpRequest.DONE) {
    ...
} else {
   ...
}
readyState對(duì)應(yīng)值

0 UNSENT 還沒open()

1 OPENED 已經(jīng)open()了

2 HEADERS_RECEIVED 已經(jīng)send()了

3 LOADING 獲取返回?cái)?shù)據(jù)中

4 DONE 完成

接下來,檢查HTTP響應(yīng)的 response code。 可能的響應(yīng)碼都已經(jīng)列在表中 W3C響應(yīng)碼列表。在下面的例子中,我們通過檢查響應(yīng)碼 200 OK 區(qū)別對(duì)待成功和不成功的AJAX調(diào)用。

if (httpRequest.status === 200) {
   ...
} else {
  ...
}
粗略的響應(yīng)碼解釋

2XX 成功

3XX 重新導(dǎo)向

4XX 請(qǐng)求有問題

5XX 服務(wù)端有問題

一切檢查后,那么怎么獲取返回?cái)?shù)據(jù)?

httpRequest.responseText – 服務(wù)器以文本字符的形式返回

httpRequest.responseXML – 以 XMLDocument 對(duì)象方式返回,之后就可以使用JavaScript來處理

那么經(jīng)常看到的jquery中的ajax是什么樣的?

我們平常用jquery的ajax都是傳一個(gè)對(duì)象,來具體自己想做什么樣的請(qǐng)求。
那么實(shí)現(xiàn)ajax的時(shí)候,也是先要從這傳進(jìn)來的一個(gè)對(duì)象里面找參數(shù)。處理完了以后就用這些得到的參數(shù)去做請(qǐng)求就可以了。

粗略的實(shí)現(xiàn)
function ajax(options){
    if(window.XMLHttpRequest){
        let xhr = new XMLHttpRequest;
    }else{
        let xhr = new ActiveXObject();//IE6 and oler
    }

    //從option獲取一些參數(shù)
    let method = options.type || "GET";
    let dataType = options.dataType || "application/x-www-form-urlencoded";
    let params = options.data;
    let success = options.success;
    let fail = option.fail;
    ...
    
    //設(shè)置onreadystatechange
    xhr.onreadystatechange = function(){
        if(xhr.readyState === 4 && xhr.status === 200){
           //call success
        }else{
            //call fail
        }
    }
    
    //正式進(jìn)行請(qǐng)求
    if(method == "GET){
        xhr.open("GET",url + "?" + params,true);
        xhr.send();
    }else if(method == "POST"){
        xhr.open("POST",url, true);
        xhr.setRequestHeader("Content-Type", dataType);
        xhr.send(params);
    }else{
       ...other method handler
    }
}
當(dāng)然還可以fetch

Fetch 是瀏覽器提供的原生 AJAX 接口。這里不做過多介紹。

重點(diǎn)提到的就是fetch請(qǐng)求返回的是一個(gè)Promise,所以對(duì)獲取數(shù)據(jù)處理要用then()

一些例子
fetch("/data.json")
.then(res => {
  res.text()       // response body (=> 還是返回Promise,需要再then())
  res.json()       // parse via JSON (=> 還是返回Promise,需要再then())
  res.status       //=> 200
  res.statusText   //=> "OK"
  res.redirected   //=> false
  res.ok           //=> true
  res.url          //=> "http://site.com/data.json"
  res.type         //=> "basic"
                   //   ("cors" "default" "error"
                   //    "opaque" "opaqueredirect")

  res.headers.get("Content-Type")
})

參考信息

MDN 什么是AJAX?
MDN XMLHttpRequest
阮一峰ES6指南 Promise對(duì)象
fetch cheatsheet

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/102037.html

相關(guān)文章

  • AJAX總結(jié)(二),手寫AJAX

    摘要:創(chuàng)建對(duì)象指定響應(yīng)函數(shù)打開連接指定請(qǐng)求發(fā)送請(qǐng)求創(chuàng)建響應(yīng)函數(shù)注第三步是使用對(duì)象的方法,字面意思是打開的意思,即打開連接。 前言 博主博客:Stillwater的博客知乎專欄:前端汪汪本文為作者原創(chuàng)轉(zhuǎn)載請(qǐng)注明出處:http://hiztx.top/2017/01/12/a... 在前端面試的時(shí)候經(jīng)常會(huì)有如下情景。AJAX會(huì)嗎?能不能手寫個(gè)AJAX?第一個(gè)問題可以參見我的另一篇博客,AJAX...

    娣辯孩 評(píng)論0 收藏0
  • js基礎(chǔ)進(jìn)階--從ajax到fetch的理解

    摘要:使用它可以讓頁面請(qǐng)求少量的數(shù)據(jù),而不用刷新整個(gè)頁面?;谑裁创鹚诘氖恰5膸齑鸹谏厦娴脑?,各種庫引用而生,然而最有名的就是的中的。它的一個(gè)優(yōu)勢(shì)異步操作,但的異步操作是基于事件的異步模型,沒有那么友好。 歡迎訪問我的個(gè)人博客:http://www.xiaolongwu.cn 基本知識(shí) 1. Ajax是什么? 答:Ajax是一種可以在瀏覽器和服務(wù)器之間使用異步數(shù)據(jù)傳輸(HTTP請(qǐng)求)...

    SoapEye 評(píng)論0 收藏0
  • 快速理解和使用 ES7 await/async

    摘要:是最重要特性之一,它是目前為止最佳的異步解決方案了。雖然沒有在中錄入,但很快就到來,目前已經(jīng)在階段。表示暫停,表示執(zhí)行下一步,如果你不了解也沒關(guān)系,可以忽略它直接學(xué)習(xí)。 await/async 是 ES7 最重要特性之一,它是目前為止 JS 最佳的異步解決方案了。雖然沒有在 ES2016 中錄入,但很快就到來,目前已經(jīng)在 ES-Next Stage 4 階段。 直接上例子,比如我們需要...

    Kross 評(píng)論0 收藏0
  • JavaScript:徹底理解同步、異步和事件循環(huán)(Event Loop)

    摘要:例如處理請(qǐng)求的線程處理事件的線程定時(shí)器線程讀寫文件的線程例如在中等等。事件循環(huán)事件循環(huán)是指主線程重復(fù)從消息隊(duì)列中取消息執(zhí)行的過程。事件觸發(fā)時(shí),表示異步任務(wù)完成,會(huì)將事件監(jiān)聽器函數(shù)封裝成一條消息放到消息隊(duì)列中,等待主線程執(zhí)行。 一. 單線程 我們常說JavaScript是單線程的。 所謂單線程,是指在JS引擎中負(fù)責(zé)解釋和執(zhí)行JavaScript代碼的線程只有一個(gè)。不妨叫它主線程。 但是實(shí)...

    wenyiweb 評(píng)論0 收藏0
  • Ajax學(xué)習(xí)與理解

    摘要:也在年發(fā)布了它的國(guó)際標(biāo)準(zhǔn)。能夠返回具體數(shù)字代表看上面的文檔,表示服務(wù)器返回的數(shù)據(jù)已經(jīng)完全接收,或者本次接收已經(jīng)失敗。請(qǐng)求結(jié)束,處理服務(wù)器返回的數(shù)據(jù)顯示提示加載中上面代碼中,等于時(shí),表明腳本發(fā)出的請(qǐng)求已經(jīng)成功。其他情況,都表示請(qǐng)求還在進(jìn)行中。 Ajax學(xué)習(xí)與理解 想要學(xué)習(xí)的Ajax內(nèi)容都在這個(gè)教程阮一峰javascript--XMLHttpRequest 對(duì)象應(yīng)該注意的點(diǎn) JS 是一門...

    thursday 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<