Ajax的原理及封裝

来源:https://www.cnblogs.com/Joanna-9908/archive/2020/03/30/12600650.html
-Advertisement-
Play Games

瞭解Ajax 就是js這個語言和服務端交互的手段 無刷新的頁面請求處理 區分表單提交 Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指一種創建互動式、快速動態網頁應用的網頁開發技術,無需重新載入整個網頁的情況下,能夠更新部 ...


瞭解Ajax

  • 就是js這個語言和服務端交互的手段
  • 無刷新的頁面請求處理
  • 區分表單提交

Ajax
即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指一種創建互動式、快速動態網頁應用的網頁開發技術,無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。
通過在後臺與伺服器進行少量數據交換,Ajax 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

發送一個Ajax請求

四個步驟:

  1. 創建ajax對象
var xhr = new XMLHttpRequest();
  1. 配置請求信息
xhr.open('GET','./01_data.php',true);
//xhr.open("請求方式","請求地址")
//請求地址: 相對路徑
//          絕對路徑  http://  https:// ===> 開發中比較常用的方式
  1. 發送請求
xhr.send(null);
  1. 接受響應
// 用事件接收 level1 => 原始版本的ajax  ,  level2 => 進階版本的ajax
// readystate  ajax狀態碼 
// change 改變
// 事件可能觸發 3-4 次
// 狀態碼有5個  0 1 2 3 4
// 4表示成功
xhr.onreadystatechange = function(){
    // 只要判定狀態即可,其他的情況不考慮
    if( xhr.readyState === 4){
        console.log(xhr.responseText)
    }
}

Ajax狀態碼

Ajax的狀態碼 有5個 : 0 1 2 3 4

  • 0:創建ajax對象成功
  • 1:配置請求信息成功
  • 2:響應已經回到瀏覽器
  • 3:瀏覽器正在解析響應體
  • 4:響應體解析完畢可以使用了

Ajax的相容處理

  • 1.創建ajax對象
var xhr = null;
    if(typeof XMLHttpRequest === "function"){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
  • 2.發送請求
xhr.onreadystatechange = function(){
        if(xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)){
            console.log(xhr.responseText);
        }
    }

封裝Ajax操作

ajax是非同步程式,我們什麼時候可以使用ajax載入回來的數據?

// ajax 相容性良好的封裝;
function ajax( options ){
    // 預設參數;
    var _default = {
        type : "GET",
        url : "",
        data : null,
        // 返回的數據類型;
        dataType : "text",
        status : null,
        success : function(){},
        complete : function(){},
        error : function(){}
    }
    // 我們會創建一些預設參數, 如果用戶傳入了其他數據會對預設參數進行覆蓋;
    options = assign( _default , options );
    options.type = options.type.toLowerCase();
    // 如果存在context;
    if( isObject(options.context) ){
        var callback_list = ["success","complete","error"];
        // 如果老版本瀏覽器更新成for迴圈;
        callback_list.forEach( function( item ){
            // console.log(options[item]);
            options[item] = options[item].bind( options.context );
        })
    }
    // 1. 創建xhr ;
    
    //創建ajax對象的相容
    var xhr = null;
    if(typeof XMLHttpRequest === "function"){
        xhr = new XMLHttpRequest();
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    // 可以簡化;
    // 1. 如果請求方式為get,那麼我們把數據拼接到url上;
    if(options.type === "get"){
        options.url =  toUrlData( options.data , options.url , options.type)
    }
    // 2. 如果請求方式為post,那麼我們把數據拼接到data上;
    if(options.type === "post"){
        options.data =  toUrlData( options.data , options.url , options.type)
    }
    
    // 2. 根據數據進行方法的調用;
    xhr.open( options.type , options.url , true ) ;
    options.type === "post" ? xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded") : "";
    // 3. 調用send方法;
    xhr.send( options.type=== "get" ? null : options.data );
    // 4. 調用回調函數;
    xhr.onreadystatechange = function(){
        // xhr程式運行結束;
        if( xhr.readyState === 4 ){
            options.complete();
            
            if( /^2\d{2}$/.test(xhr.status) ){
                // 5.傳遞數據
                // 如果需要轉換成json那麼我們就返回json,如果不需要原樣返回;
                // 如果JSON.parse報錯了那麼我們要調用錯誤函數;
                try{
                    var res = options.dataType === "json" ? JSON.parse(xhr.responseText) : xhr.responseText; 
                    options.success(res);
                }catch(e){
                    options.error(e,xhr.status);
                }
            }else{
                options.error("error",xhr.status);
            }
            // 策略模式調用 : 
            if( isObject(options.status) ){
                typeof options.status[xhr.status] === "function" ? options.status[xhr.status]() : "";
            }
        }
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vue表單控制項綁定 v-model 在表單控制項元素上創建雙向數據綁定 文本框雙向綁定 多選框演示 下拉列表演示 vue自定義組件 組件放在components目錄下 組件基本要素:props $emit 通過import導入自定義組件 製作一個倒計時組件: 1、在conponents目錄下,新建一個 ...
  • vue條件渲染 v-if v-else-if v-else v-if後面是true,則會顯示;false則不顯示 結果 輸出 v-show 當為true時顯示,為false不顯示 vue列表渲染 帶下標的情況 對象的迴圈 vue事件處理器 v-on 指令綁定事件,縮寫@ 事件綁定的方法在method ...
  • 作用 用來保存所有傳遞給函數的實際參數 註意點 每個函數都有arguements,實際上它就是一個偽數組 舉例 自定義函數,傳入任意個數值,返回它們最終的和 代碼 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <titl ...
  • HTML 字元實體/HTML 中的預留字元必須被替換為字元實體,一些在鍵盤上找不到的字元也可以使用字元實體來替換。 在 HTML 中,某些字元是預留的。您不能使用包含這些字元的文本。在 HTML 中不能使用小於號(<)和大於號(>),這是因為瀏覽器會誤認為它們是標簽。如果希望正確地顯示預留字元,我們 ...
  • TypeScript的原始數據類型 String Number boolean null undefined enum symbol // Number var num:number=1; // 整數 num = 2.5; // 小數 num = 0xf00d; // 十六進位 num = 0b01 ...
  • <script>定義了客戶端腳本;<noscript>定義了不支持腳本瀏覽器輸出的文本;html <script> 標簽:<script> 標簽用於定義客戶端腳本,比如 JavaScript;<script> 元素既可包含腳本語句,也可通過 src 屬性指向外部腳本文件;JavaScript 最常用... ...
  • 什麼是HTML 顏色?它採用的是 RGB 顏色,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色。HTML 顏色由一個十六進位符號來定義,這個符號由紅色、綠色和藍色的值組成(RGB);每種顏色的最小值是0(十六 ...
  • 非同步 1.知道哪部分代碼是非同步的; 2.必須要知道非同步程式之中的數據或者賦值的變數在哪裡可用; js:單線程語言 上面一行代碼不執行結束,下麵一行代碼不會執行; 單線程 多線程 js中存在很大需要長時間等待才會執行的代碼; 非同步 :在js中需要消耗大量時間等待某些程式執行的時候,會讓正常程式繼續執行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...