非常適合新手的jq/zepto源碼分析07---ajax的封裝

来源:http://www.cnblogs.com/jiebba/archive/2017/03/15/6532668.html
-Advertisement-
Play Games

複習下ajax吧! 1.創建XMLHttpRequest對象 代碼僅供參考,具體功能可以自己擴展。 http://www.cnblogs.com/jiebba/p/6529854.html http://www.cnblogs.com/jiebba 我的博客,來看吧! 如果有錯誤,請留言修改下 哦! ...


複習下ajax吧!

 1.創建XMLHttpRequest對象

xmlhttp=new XMLHttpRequest();
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); //ie7以下

xmlhttp.open("GET","test1.txt",true);   參數 method,url,async()
xmlhttp.send();
xmlhttp.setRequestHeader(name,value);
Accept: 瀏覽器能夠處理的內容類型。
Accept-Charset: 瀏覽器能顯示的字元集。
Accept-Language: 瀏覽器當前設置的語言。
Connection: 瀏覽器與伺服器之間連接的類型
Cookie: 當前頁面設置的任何Cookie.
Host: 發出請求的頁面所在的域。
Referer: 發出請求的頁面的URI
User-Agent: 瀏覽器的用戶代理字元串。
Content-type:請求數據類型
Cache-Control :指定請求響應的緩存機制
Content-Length:內容長度
Date:發送請求時間


xmlhttp.onreadystatechange  狀態改變出發該函數
xmlhttp.readyState   狀態
0 : 請求未初始化
1 : 伺服器連接已建立
2 : 請求已接收
3 : 請求處理中
4 : 請求已完成
xmlhttp.status
2xx : 成功
3xx : 轉向或者緩存
4xx : 未找到頁面等
5xx : 伺服器報錯


        $.ajaxSettings = {
            // 預設請求類型
            type: 'GET',
            // 請求執行前的回調函數
            beforeSend: empty,
            // 執行成功後的回調函數
            success: empty,
            // 伺服器返回錯誤的回調函數
            error: empty,
            // 請求完成的回調函數
            complete: empty,
            // 回調函數的上下文
            context: null,
            // 是否綁定一個全局事件
            global: true,
            // Transport
            xhr: function () {
                return new window.XMLHttpRequest()
            },
            // 接受的類型
            accepts: {
                script: 'text/javascript, application/javascript, application/x-javascript',
                json:   jsonType,
                xml:    'application/xml, text/xml',
                html:   htmlType,
                text:   'text/plain'
            },
            // 是否是跨域
            crossDomain: false,
            // 請求超時時間
            timeout: 0,
            // 是否序列化
            processData: true,
            // 是否緩存
            cache: true,
            dataFilter: empty
        }

  

        $.ajax = function(options){
            var settings = $.extend({}, options || {}),
                deferred = $.Deferred && $.Deferred(),   //檢查是有延時函數,有則創建一個
                urlAnchor, hashIndex
        //設置預設參數 for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]         //創建Event對象,初始化ajaxStart事件,並且執行該事件 ajaxStart(settings)         //檢查是否跨域 if (!settings.crossDomain) { urlAnchor = document.createElement('a') urlAnchor.href = settings.url // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049 urlAnchor.href = urlAnchor.href settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host) } if (!settings.url) settings.url = window.location.toString() //如果不存在url,直接提交到當前路徑 if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex) //去掉hash #後面的hash
     //序列化數據,如果是get/jsonp,直接把數據綁定在url上面 serializeData(settings) var dataType = settings.dataType, hasPlaceholder = /\?.+=\?/.test(settings.url) // 查看url是否有 callback定義 如果定義了,就設置為jsonp請求 if (hasPlaceholder) dataType = 'jsonp'         //如果不緩存,就在後面添加當前請求時間,每次請求不同就不會緩存 if (settings.cache === false || ( (!options || options.cache !== true) && ('script' == dataType || 'jsonp' == dataType) )) settings.url = appendQuery(settings.url, '_=' + Date.now())         //如果是jsonp,則url後面添加 &callback=? if ('jsonp' == dataType) { if (!hasPlaceholder) settings.url = appendQuery(settings.url, settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?') return $.ajaxJSONP(settings, deferred) } var mime = settings.accepts[dataType], //獲取接收的數據類型 headers = { }, setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] }, protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol, //得到url協議或者當前協議 xhr = settings.xhr(), //獲得xmlthttprequest對象 nativeSetHeader = xhr.setRequestHeader, //獲取設置 頭部信息的方法 abortTimeout if (deferred) deferred.promise(xhr) //設置延時器 if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest') //設置當前請求為ajax 非同步請求 setHeader('Accept', mime || '*/*') //設置可接收的數據類型 if (mime = settings.mimeType || mime) { if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0] xhr.overrideMimeType && xhr.overrideMimeType(mime) //設置可接收的類型 } if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET'))
          //設置提交數據的方式
          //application/x-www-form-urlencode 將提交的數據進行urlencode (form表單提交的預設方式) ?name=value1&name2=value2
          //multipart/form-data 數據每一條都用 boundary 分割符隔開 (form傳輸file文件時候 一般用這個)
          //application/json    直接提交json
setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded') //設置提交方式 if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name]) //設置頭部信息 xhr.setRequestHeader = setHeader         //監聽 readyState 改變的函數 xhr.onreadystatechange = function(){
          // 當readyState 為4 時候請求完成 if (xhr.readyState == 4) {
//清除該監聽 xhr.onreadystatechange = empty clearTimeout(abortTimeout) //清除超出時間的 定時器 var result, error = false
            //200-300 成功
            //304 檢查響應的last-modified 和 if-modified-since 如果相等 直接用本地緩存的數據
            // if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) { dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'))               //接受的數據類型 script/xml/json if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob') //二進位數據 result = xhr.response else { result = xhr.responseText //文本數據 try { // 這裡是要用 setting 配置裡面的 dataFilter和content 來處理數據 result = ajaxDataFilter(result, dataType, settings) if (dataType == 'script') (1,eval)(result) // (1,eval) 相容低版本IE 其實就是eval else if (dataType == 'xml') result = xhr.responseXML //如果是xml 直接返回xml else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result) //非空的話 直接解析result } catch (e) { error = e } if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred) //錯誤,調用setting裡面error } ajaxSuccess(result, xhr, settings, deferred) //調用成功函數 } else { ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred) //錯誤,調用setting裡面的error } } }         //如果在 setting 的before函數中 返回false 直接返回,斷開請求 if (ajaxBeforeSend(xhr, settings) === false) { xhr.abort() ajaxError(null, 'abort', xhr, settings, deferred) return xhr } var async = 'async' in settings ? settings.async : true
        //創建一個請求 xhr.open(settings.type, settings.url, async, settings.username, settings.password)         //添加請求欄位信息 if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]         //nativeSetHeader 設置頭部信息 xhr.setRequestHeader(name,value) for (name in headers) nativeSetHeader.apply(xhr, headers[name]) //headers[name] ->[name,value]         // 超時後執行 if (settings.timeout > 0) abortTimeout = setTimeout(function(){ xhr.onreadystatechange = empty xhr.abort() ajaxError(null, 'timeout', xhr, settings, deferred) }, settings.timeout) // 發送數據返回,當前xmlHttpRequrest對象 xhr.send(settings.data ? settings.data : null) return xhr }

  


這個是主要的對象ajax的封裝。


代碼僅供參考,具體功能可以自己擴展。

http://www.cnblogs.com/jiebba/p/6529854.html 

http://www.cnblogs.com/jiebba    我的博客,來看吧!

如果有錯誤,請留言修改下 哦!


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

-Advertisement-
Play Games
更多相關文章
  • 微服務要求 服務協作 服務治理 服務治理 1 懷疑第三方 堅持一條信念:“所有第三方服務都不可靠”,不管第三方什麼天花亂墜的承諾。基於這樣的信念,我們需要有以下行動。 1.1 有兜底,制定好業務降級方案 如果第三方服務掛掉怎麼辦?我們業務也跟著掛掉?顯然這不是我們希望看到的結果,如... ...
  • 本文地址 點擊關註微信公眾號 wenyuqinghuai 分享提綱: 1. 概述 2. UML類圖 3. UML時序圖 4. 參考資料 分享提綱: 1. 概述 2. UML類圖 3. UML時序圖 4. 參考資料 1.概述 1.1)百度百科: 又稱統一建模語言或標準建模語言,是始於1997年一個OM ...
  • 隨筆記錄,以供以後參考 1.生成CSR和Key。IIS里也可以生成。生成網址:http://tools.globalsign.cn/#/generator-csr CSR就是Certificate Secure Request證書請求文件。要證明網站是可信的,數據傳輸是加密的,就需要由CA機構頒發證 ...
  • 我們經常利用按鈕進行一些頁面值的處理工作,但是預設的邏輯造成,每次新填報的值,需要點擊下空白區域或是執行某個其他操作才可以被正確讀取,那麼我們如何處理呢? ...
  • 寫在前面 Md2site是基於 "Omi" 的一款Markdown轉網站工具,使用簡單,生成的文件輕巧,功能強大。 官網: "http://alloyteam.github.io/omi/md2site/" Github: "https://github.com/AlloyTeam/omi/tree ...
  • 在使用 ueditor 開發時, 作為一個web文本編輯器使用時。 當點擊上傳圖片時, 文件夾要延遲好久才能打開。 解決: 針對多圖片上傳, 將/ueditor/dialogs/image/image.js 文件下的以下代碼 改為 針對單圖片上傳, 將/ueditor/ueditor.all.js ...
  • AJAX技術是網頁構建的必備技能之一,本文希望能幫助大家輕鬆的學習這項技術 ...
  • 文本整理了javascript操作DOM的一些常用的api,根據其作用整理成為創建,修改,查詢等多種類型的api,主要用於複習基礎知識,加深對原生js的認識。 基本概念 在講解操作DOM的api之前,首先我們來複習一下一些基本概念,這些概念是掌握api的關鍵,必須理解它們。 Node類型 DOM1級 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...