国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript實(shí)現(xiàn)Ajax

binta / 1119人閱讀

摘要:用于從網(wǎng)絡(luò)上獲取數(shù)據(jù),有了對(duì)象,就可以實(shí)現(xiàn)頁(yè)面的無(wú)刷新請(qǐng)求數(shù)據(jù),就可以做到一個(gè)局部的更新,也可以獲取多種類(lèi)型的數(shù)據(jù)文件。這篇文章主要是分享了中對(duì)象的基本屬性和方法從實(shí)例化初始化發(fā)送和接受四個(gè)階段完成了網(wǎng)絡(luò)請(qǐng)求核心內(nèi)容封裝。

1:基本概念

jQuery的Ajax請(qǐng)求實(shí)際上是封裝的一個(gè)XHLHttpRequest,從字面意思來(lái)看是,XML是一種文件格式,Http是一個(gè)網(wǎng)絡(luò)請(qǐng)求,Request最開(kāi)始是用于請(qǐng)求XML文件的,后來(lái)不斷擴(kuò)展可以請(qǐng)求多種類(lèi)型的文件。

XHLHttpRequest,網(wǎng)絡(luò)請(qǐng)求模塊,或者是一個(gè)瀏覽器網(wǎng)絡(luò)線程。用于從URL網(wǎng)絡(luò)上獲取數(shù)據(jù),有了對(duì)象,就可以實(shí)現(xiàn)頁(yè)面的無(wú)刷新請(qǐng)求數(shù)據(jù),就可以做到一個(gè)局部的更新,也可以獲取多種類(lèi)型的數(shù)據(jù)(ftp、文件)。

2:要實(shí)現(xiàn)和使用XMLHttpRequest

它是一個(gè)對(duì)象,首先我們需要實(shí)例化,定義一個(gè):

    var xhr = new XMLHttpRequest();
3:初始化請(qǐng)求,給定一些必要的配置,給它一些property
    //Ajax請(qǐng)求時(shí)的參數(shù)設(shè)置
    method          請(qǐng)求方式
    url             請(qǐng)求地址
    async           是否異步
    user            用戶名
    password        密碼
    
    xhr.open(method,url,async,user,password);
4:發(fā)送請(qǐng)求(encodeURLComponent)
    xhr.send(data);
    等待接收
5:接收網(wǎng)絡(luò)請(qǐng)求返回

一般有如下屬性:

responseText,請(qǐng)求返回的數(shù)據(jù)內(nèi)容,可以是一段文本,是一段二進(jìn)制或者是一個(gè)json

responseXML,是一個(gè)文件,如果響應(yīng)頭內(nèi)容是text/xml,這個(gè)屬性將保留響應(yīng)數(shù)據(jù)的XML、DOM文檔。

status,響應(yīng)的HTTP狀態(tài),如 200(正常,200-300之間都表示成功) 304(使用緩存) 404(沒(méi)找到) 500(服務(wù)器內(nèi)部錯(cuò)誤)等

statusText,HTTP狀態(tài)說(shuō)明

readyStatus,請(qǐng)求/響應(yīng)過(guò)程的當(dāng)前活動(dòng)階段,一共有5個(gè)值:0(未被調(diào)用open),1(已被調(diào)用open但未發(fā)送),2(已調(diào)用send),3(已接收到請(qǐng)求返回的數(shù)據(jù)),4(請(qǐng)求已完成)。

timeout,設(shè)置請(qǐng)求超時(shí)時(shí)間

    xhr.onreadystatechange = () => {
        if (xhr.readyStatus === 4) {
            /* HTTP 狀態(tài)在 200-300 之間表示請(qǐng)求成功 */
            /* HTTP 狀態(tài)為 304 表示請(qǐng)求內(nèi)容未發(fā)生改變,可直接從緩存中讀取 */
            if (xhr.status >= 200 &&
                xhr.status < 300 ||
                xhr.status == 304) {
                console.log("請(qǐng)求成功", xhr.responseText)
            }
        }
    }

6:封裝(promise)
    function ajax (options) {
        /* 獲取請(qǐng)求地址 */
        let url = options.url;
        /* 獲取請(qǐng)求方法 */
        const method = options.method.toLocaleLowerCase() || "get";
        /* 默認(rèn)異步 */
        const async = options.async != false;
        /* 獲取請(qǐng)求request數(shù)據(jù) */
        const data = options.data;
        /* 實(shí)例化XMLHttpRequest */
        const xhr = new XMLHttpRequest();
        /* 設(shè)置超時(shí)時(shí)間 */
        if (options.timeout && options.timeout > 0) {
            xhr.timeout = options.timeout
        }
    
        return new Promise ( (resolve, reject) => {
            /* 添加超時(shí)回調(diào) */
            xhr.ontimeout = () => reject && reject("請(qǐng)求超時(shí)");
            /* 成功回調(diào) */
            xhr.onreadystatechange = () => {
                if (xhr.readyState == 4) {
                    if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
                        resolve && resolve(xhr.responseText);
                    } else {
                        reject && reject();
                    }
                }
            }
    
            /* 失敗回調(diào) */
            xhr.onerror = err => reject && reject(err);
    
            /* 拼接參數(shù) */
            let paramArr = [];
            let encodeData;
            if (data instanceof Object) {
                for (let key in data) {
                    paramArr.push( encodeURIComponent(key) + "=" + encodeURIComponent(data[key]) );
                }
                encodeData = paramArr.join("&");
            }
    
            /* get請(qǐng)求 */
            if (method === "get") {
                const index = url.indexOf("?")
                if (index === -1) url += "?"
                else if (index !== url.length -1) url += "&"
                url += encodeData
            }
    
            /* 初始化請(qǐng)求 */
            xhr.open(method, url, async);
    
            /* get直接發(fā)送拼接的URL */
            if (method === "get") xhr.send(null);
    
            if (method === "post") {
                xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8")
                xhr.send(encodeData)
            }
        })
    }

總結(jié):
關(guān)于網(wǎng)絡(luò)請(qǐng)求,一般常用的有四種:

一個(gè)是get,獲取網(wǎng)絡(luò)資源

然后是post,一般用于提交數(shù)據(jù),提交數(shù)據(jù)的參數(shù)是放在請(qǐng)求的body里面的

delete,刪除

put,標(biāo)準(zhǔn)的一個(gè)修改

關(guān)于Http的簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求或者是跨域,在跨域時(shí)由于瀏覽器的安全機(jī)制,涉及到一個(gè)問(wèn)題關(guān)于在Ajax請(qǐng)求 ,是在請(qǐng)求之后還是請(qǐng)求之前判斷跨域,這時(shí)候就需要了解一下簡(jiǎn)單請(qǐng)求和復(fù)雜請(qǐng)求。

簡(jiǎn)單請(qǐng)求是先把資源請(qǐng)求回來(lái),然后再去判斷是否跨域。如果是一個(gè)復(fù)雜請(qǐng)求,瀏覽器會(huì)先去發(fā)送一個(gè)嗅探或者是欲請(qǐng)求(一般是一個(gè)option),先判斷是否跨域,如果不是跨域那就執(zhí)行,如果是跨域那就直接不請(qǐng)求了。一般來(lái)講,如果get不修改它的Content-Type,那么基本上都是簡(jiǎn)單請(qǐng)求。post如果采用www-form的形式,也是一個(gè)簡(jiǎn)單請(qǐng)求。

這篇文章主要是分享了Javascript中XMLHttpRequest對(duì)象的基本屬性和方法, 從實(shí)例化、初始化、發(fā)送和接受四個(gè)階段完成了Ajax網(wǎng)絡(luò)請(qǐng)求核心內(nèi)容封裝。

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

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

相關(guān)文章

  • 異步 JavaScript 與 Promise

    摘要:為這些回調(diào)函數(shù)分別命名并分離存放可以在形式上減少嵌套,使代碼清晰,但仍然不能解決問(wèn)題。如果在一個(gè)結(jié)束成功或失敗,同前面的說(shuō)明后,添加針對(duì)成功或失敗的回調(diào),則回調(diào)函數(shù)會(huì)立即執(zhí)行。 異步? 我在很多地方都看到過(guò)異步(Asynchronous)這個(gè)詞,但在我還不是很理解這個(gè)概念的時(shí)候,卻發(fā)現(xiàn)自己常常會(huì)被當(dāng)做已經(jīng)很清楚(* ̄? ̄)。 如果你也有類(lèi)似的情況,沒(méi)關(guān)系,搜索一下這個(gè)詞,就可以得到大致...

    livem 評(píng)論0 收藏0
  • 原生javaScript實(shí)現(xiàn)Ajax 和 jQuery實(shí)現(xiàn)Ajax

    摘要:作者后臺(tái)使用的是語(yǔ)言,所以這里以后臺(tái)為例子不影響學(xué)習(xí)一原生使用方法創(chuàng)建對(duì)象兼容處理處理低版本不兼容問(wèn)題準(zhǔn)備發(fā)送請(qǐng)求方式接口參數(shù)名參數(shù)值異步執(zhí)行發(fā)送回調(diào)是表示數(shù)據(jù)解析完成,后臺(tái)處理完成了。是表示處理的結(jié)果是的。 作者后臺(tái)使用的是php語(yǔ)言,所以這里以php后臺(tái)Api為例子,不影響學(xué)習(xí)Ajax 一、 javaScript原生使用Ajax 1.get方法 //1.創(chuàng)建對(duì)象 兼容處理 var ...

    ssshooter 評(píng)論0 收藏0
  • 原生JavaScript實(shí)現(xiàn)AJAX、JSONP

    摘要:在這里講解一下用原生如何實(shí)現(xiàn)。當(dāng)然,前面也說(shuō)過(guò),你可以給定固定回調(diào)函數(shù)名最后我已經(jīng)將和請(qǐng)求合并在一起了,下載鏈接原文鏈接原生實(shí)現(xiàn)如有問(wèn)題,歡迎在下方留言 相信大多數(shù)前端開(kāi)發(fā)者在需要與后端進(jìn)行數(shù)據(jù)交互時(shí),為了方便快捷,都會(huì)選擇JQuery中封裝的AJAX方法,但是有些時(shí)候,我們只需要JQuery的AJAX請(qǐng)求方法,而其他的功能用到的很少,這顯然是沒(méi)必要的。 其實(shí),原生JavaScript...

    xcc3641 評(píng)論0 收藏0
  • 前端相關(guān)大雜燴

    摘要:希望幫助更多的前端愛(ài)好者學(xué)習(xí)。前端開(kāi)發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開(kāi)發(fā)工程師當(dāng)你問(wèn)起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒(méi)有網(wǎng)絡(luò)請(qǐng)求功能的庫(kù)。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡(jiǎn)單 原文地址:Learning React.js is easier than you think 原文作...

    fuyi501 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---35、 Ajax數(shù)據(jù)爬取

    摘要:所以說(shuō),我們所看到的微博頁(yè)面的真實(shí)數(shù)據(jù)并不是最原始的頁(yè)面返回的,而是后來(lái)執(zhí)行后再次向后臺(tái)發(fā)送了請(qǐng)求,拿到數(shù)據(jù)后再進(jìn)一步渲染出來(lái)的。結(jié)果提取仍然是拿微博為例,我們接下來(lái)用來(lái)模擬這些請(qǐng)求,把馬云發(fā)過(guò)的微博爬取下來(lái)。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---34、數(shù)據(jù)存儲(chǔ):非關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ):Redis下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---36、分析Ajax爬取今日頭條街拍美圖 ...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<