Ajax

  • 關鍵詞:Ajax
Ajax:在不刷新頁面的情況下,向服務器發送請求、獲取數據,并異步更新網頁的某部分!

1. Ajax 是什么?有什么作用?

  • Ajax 全稱“Asynchronous Javascript And XML”,即:異步的 JavaScript 和 XML。
  • Ajax 本質就是一個 XMLHttpRequest 對象,這個對象提供了一些接口:用于向服務器發送請求和解析服務器響應。
  • Ajax 就是一種技術,可在不刷新頁面的情況下,與服務器交互數據,采用異步方式更新網頁的部分內容。
  • 采用 Ajax 與服務器交互數據,可使用戶擁有較好的體驗:運行頁面上某個功能時頁面不會重新加載,且等待過程中不會影響頁面上其他功能的運行。

2. 前后端開發聯調需要注意哪些事情?后端接口完成前如何 mock 數據?

前后端在進行開發前,需要協作商定數據和接口的各項細節,后端負責提供數據,前端負責展示數據(根據數據負責頁面的開發)。

  • 前后端開發聯調注意事項
  1. URL:接口名稱
  2. 發送請求的參數和格式(get/post)
  3. 數據響應的數據格式(數組/對象)
  4. 根據前后端約定,整理接口文檔
  • 如何 mock 數據
  1. 搭建 web 服務器
  2. 根據接口文檔仿造假數據
  3. 關聯前后端文件,開啟 web 服務器
  4. 驗證前端頁面功能及顯示是否正確

3. 點擊按鈕,使用 ajax 獲取數據,如何在數據到來之前防止重復點擊?

  • 思路
  1. 使用狀態鎖檢驗此刻是否正在請求數據(是否上鎖):是則放棄請求,否則發送請求
  2. 請求數據之前,解鎖狀態:“ 發送 Ajax 請求 ” 代碼可執行
  3. 正在請求數據,上鎖狀態:“ 發送 Ajax 請求 ” 代碼被禁用
  4. 拿到后臺數據,解鎖狀態:“ 發送 Ajax 請求 ” 代碼被解禁
  • 代碼
var btn = document.querySelector('.btn');
var isLoading = false; // 狀態鎖1:發送請求之前,解鎖狀態
btn.addEventListener('click', function () {
        if(isLoading){
            return; // 狀態鎖0:用于檢測是否正在請求數據,是則跳出,否則繼續
        }
        ajax({ // 調用封裝的 ajax 函數
            method: 'get',
            url: '/lockModal',
            data: {},
            async: 'true',
            success: function () {
                onSuccess();
                isLoading = false;  // 狀態鎖3.1:請求數據已完成(成功拿到數據),解鎖狀態
            },
            error: function() {
                onError();
                isLoading = false;  // 狀態鎖3.2:請求數據已完成(失敗拿到數據),解鎖狀態
            }
        });
        isLoading = true; // 狀態鎖2:正確請求數據,上鎖狀態
    })

4. 封裝一個 ajax 函數,能通過如下方式調用。后端在本地使用server-mock來 mock 數據

ajax({
     method: '',
     url: '',
     data: {},
     // dataType: '', // 若需要則添加,否則不需添加
     asyns: true, // 根據需要可以設置封裝函數的默認值為 true
     success: function () {},
     error: function () {}
})
  • ajax 簡單封裝
function ajax(opts) {
    // 三、對數據進行處理
    // 3.1、若數據存在,將數據組裝成字符串
    if(opts.data){
        var dataStr = '';
        for(var key in opts.data){
            dataStr = dataStr + key + '=' + opts.data[key] + '&';
        }
        opts.data = dataStr.substring(0, dataStr.length-1);
    }
    // 3.2、將方法處理為小寫
    opts.method = opts.method.toLowerCase();
    // 3.3、若為 get 方法,重新組裝 url
    if( (opts.method == 'get') && opts.data){
        opts.url = opts.url + '?' + opts.data;
    }
    // 四、開始 AJAX 函數
    // 4.1、創建 AJAX 對象
    var xhr = new XMLHttpRequest();
    // 4.2、規定所需數據格式
    xhr.open(opts.method, opts.url, opts.asyns);
    // 4.3、發送請求
    if(opts.method == 'get'){
        xhr.send();
    }else if(opts.method == 'post'){
        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        xhr.send(opts.data);
    }
    // 4.4、檢測服務器響應
    xhr.onreadystatechange = function () {
        if( (xhr.readyState == 4) && (xhr.status == 200) ){
            opts.success( JSON.parse(xhr.responseText) );
            console.log(opts.method);
        }else {
            opts.error(); // 此處有待改進,目前到此為止
        }
    }
}

5. 實現加載更多的功能,后端在本地使用 server-mock 來模擬數據

  • 思路
  1. 編寫 HTML 和 CSS 代碼
  2. JS部分:給 ‘加載更多’ 按鈕添加事件:當用戶點擊時,執行下列代碼
  3. 調用封裝好的 ajax 函數,將定義好的請求發送給后端
  4. 在后端 mock 數據,獲取前端參數,處理數據,給前端發送數據
  5. 前端接收并調用數據,將數據展示在頁面上

6. 額外實現一個功能:換一批看看,后端自行 mock 數據

本文章著作權歸饑人谷和作者所有,轉載須說明來源!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容