1. 程式人生 > >ajax的再次封裝!

ajax的再次封裝!

js的動態載入、快取、更新以及複用 系列有點卡文,放心會繼續的。先來點更基礎的,為js的載入做點鋪墊。

  jQuery的ajax本來就很方便了,為啥還要在進一步的封裝呢?這個首先要看專案的具體需求了,如果覺得不需要,那麼完全可以直接用jQuery提供的各種ajax的方法。如果像我似地,感覺不太方便的話,那麼完全可以按照自己的想法和需求來再次封裝一下。

  需求:

  1、呼叫的時候更加的簡單。

  2、可以靈活的做各種設定和變化。

  3、可以滿足一些通用的需求。比如出錯的時候給出提示。

  專案現狀:

    做ajax請求的時候,會有一個載入的動畫,在ajax發起的時候要自動開始,載入完畢之後要自動停止。出錯了也要自動停止,並且給出錯誤提示。請求的URL比較固定,按照增刪改查來分類。要可以跨域,也可以不跨域。需要靈活的進行切換。ajax獲得資料的同時,還會附帶一段除錯資訊,需要顯示出來。有專門的處理函式,但是需要呼叫。

  實現:

    直接上程式碼吧。

//對ajax的封裝
Nature.Ajax = function (ajax) {
    //最基礎的一層封裝
   
        //定義預設值
        var defaultInfo = {
            type: "GET",                        //訪問方式:如果dataPata不為空,自動設定為POST;如果為空設定為GET。
            dataType: Nature.sendDataType,      //資料型別:JSON、JSONP、text。由配置資訊來搞定,便於靈活設定
cache: true, //是否快取,預設快取 xhrFields: { //允許跨域訪問時新增cookie。cors跨域的時候需要設定 withCredentials: true }, urlPata: {},//url後面的引數。一定會加在url後面,不會加到form裡。 formPata: {},//表單裡的引數。如果dataType是JSON,一定加在form裡,不會加在url後面;如果dataType是JSONP的話,只能加在url後面。
//url: //依靠上層指定 //timeout: 2000, error: function() { }, //如果出錯,停止載入動畫,給出提示。也可以增加自己的處理程式 success: function() { } //成功後顯示debug資訊。也可以增加自己的處理程式 }; //補全ajaxInfo if (typeof ajaxInfo.dataType == "undefined") { ajaxInfo.dataType = defaultInfo.dataType; } if (typeof ajaxInfo.formPata == "undefined") { ajaxInfo.type = "GET"; } else { if (ajaxInfo.dataType == "JSON") { ajaxInfo.type = "POST"; } else { //get或者jsonp ajaxInfo.type = "POST"; } ajaxInfo.data = ajaxInfo.formPata; } if (typeof ajaxInfo.cache == "undefined") { ajaxInfo.cache = defaultInfo.cache; } //處理URL if (typeof ajaxInfo.urlPata != "undefined") { var tmpUrlPara = ""; var para = ajaxInfo.urlPata; for (var key in para) { tmpUrlPara += "&" + key + "=" + para[key]; } if (ajaxInfo.url.indexOf('?') >= 0) { //原地址有引數,直接加 ajaxInfo.url += tmpUrlPara; } else { //原地址沒有引數,變成?再加 ajaxInfo.url += tmpUrlPara.replace('&', '?'); } } //開始執行ajax $.ajax({ type: ajaxInfo.type, dataType: ajaxInfo.dataType, cache: ajaxInfo.cache, xhrFields: { //允許跨域訪問時新增cookie withCredentials: true }, url: ajaxInfo.url, data: ajaxInfo.data, //timeout: 2000, error: function() { //訪問失敗,自動停止載入動畫,並且給出提示 alert("提交" + ajaxInfo.title + "的時候發生錯誤!"); if (typeof top.spinStop != "undefined") top.spinStop(); if (typeof ajaxInfo.error == "function") ajaxInfo.error(); }, success: function (data) { if (typeof(parent.DebugSet) != "undefined") parent.DebugSet(data.debug);  //呼叫顯示除錯資訊的函式。 if (typeof (ajaxInfo.ctrlId) == "undefined") ajaxInfo.success(data); else { ajaxInfo.success(ajaxInfo.ctrlId, data); } } }); };

    這是最底層的封裝,然後是根據URL的封裝,其實就是避免在程式碼裡到處寫URL的問題。

 1 Nature.Data.MetaData = function () {
 2 
 3     var ajax = Nature.Ajax;//簡化一下
 4 
 5 
 6     /*獲取頁面檢視的元資料*/
 7     this.ajaxGetMeta = function (ajaxData) {
 8 
 9         ajaxData.url = Nature.resourceUrl + "/MetaData/GetMeta.ashx";
10         ajaxData.cache = false;
11         
12         ajax(ajaxData);
13     };
14 
15     
16 
17 }
18 
19 Nature.Data.CusData = function () {
20 
21     var ajax = Nature.Ajax;
22     
23   34     //獲取客戶資料
35     this.ajaxGetData = function(ajaxData) {
36 
37         //增刪改查服務的網址
38         var url = Nature.resourceUrl;
39         if (typeof ajaxData.url == "undefined")
40             url += "/Data/GetData.ashx";
41         else
42             url += ajaxData.url;
43 
44         ajaxData.url = url;
45         ajaxData.cache = false;
46 
47         ajax(ajaxData);
48         
49     };
50     
51     /*刪除資料*/
52     this.ajaxDeleteData = function (ajaxData) {
53         var url = Nature.resourceUrl;
54         
55         if (typeof ajaxData.url == "undefined")
56             url += "/Data/GetData.ashx";
57         else
58             url += ajaxData.url;
59         
60         ajaxData.url = url;
61         ajaxData.cache = false;
62 
63         ajax(ajaxData);
64     };
65     
66 
67 }

    這個是按照增刪改查的URL地址來定的幾個函式。主要目的就是處理具體的URL,避免程式碼裡面到處都是URL的混亂問題。

    最後就是具體應用的地方了。

 1  var load = new Nature.Data.MetaDate();
 2 
 3   load.ajaxGetMeta({
 4             urlPata: { action: "tree", mdid: 0, dbid: dataBaseId, ProjectID: projectId, cacheKey: 0 },
 5             title: "獲取XXX",
 6             success: function (msg) {
 7                 
 8                 if (typeof top.__cache == "undefined")
 9                     top.__cache = {};/* 開闢快取空間 */
10                  
11                 top.__cache.treeMeta = msg.data;
12                 
13                 create2(msg.data);
14             }
15         });

  這樣呼叫起來就比較簡單了,避免了一些常用且固定的引數的設定,比如type、dataType、cache、url等。可能有些童鞋會想了,不是有$.get和$.post了嗎,比你的更簡潔吧,你還自己折騰啥!

  $.get和$.post確實更簡潔,但是不夠靈活,比如cache的設定,有的時候需要快取,有的時候不需要快取。再比如type,有的頁面需要跨域,有的地方不需要跨域。有的時候要根據專案來統一設定(切換)。所以我自己折騰了一下。

  詳細說明:

  預設引數裡的幾個屬性的含義。

  1、title。ajax有可能出錯,出錯了就應該有個提示。但是一個頁面往往有多個ajax,到底是哪個出錯了?所以我設定了一個title的屬性,在error的時候 alert("提交" + ajaxInfo.title + "的時候發生錯誤!");這樣就比較清晰了,至少按照title的屬性值來find一下,可以快速定位。

  2、urlPata和formPata。jQuery的ajax只有一個data的屬性。當get的時候,會把data放到URL裡面,傳遞給伺服器;當POST的時候,會把data放在form裡面,提交給伺服器。這個似乎挺好,但是在post的時候,我需要明確的把一些引數放在URL裡面,一些引數放在form裡面。這個就不能都放在data裡面,我還得自己去拼接URL。麻煩還愛出錯。所以我就分成了兩個屬性urlPata和formPata。

    urlPata肯定會出現在URL裡面。formPata就需要根據情況而定了。JSON的時候會放在form裡面,JSONP的時候就只能放在URL裡面了。

  3、xhrFields。這個就涉及到HTML5.0裡面對post跨域的支援問題了。一般提到跨域,想到的都是JSONP,但是JSONP是偽裝成<script>來實現的跨域,由於js並不支援post,所以導致無法實現post的跨域提交。現在HTML5.0解決了這個問題,就是cors。我也是最近幾天才弄明白這個。後來發現jQuery也是支援cors的。jQUery.support.cors = true; 這樣就可以開啟cors。然後在測試的時候發現個問題,出於安全考慮,預設情況下cors的跨域是不會附帶cookie資訊的,需要手動設定。於是就出現了xhrFields這一段。當然要完全實現cors,伺服器端也需要做相應的設定,這個會在我的《細說跨域那點事》裡面有詳細的說明。

  4、error。ajax訪問,難免會出現點小意外,有的是伺服器返回的值有問題,有時候是伺服器報錯了。那麼要怎麼辦呢?於是就出現了這個error的統一處理函式。在這裡首先會根據title屬性給出一個提示,告訴使用者,訪問出錯了。然後會把載入的動畫提示給停掉。一開始在出錯的時候沒有去停止載入動畫,好多使用者就更我說,你那個頁面,轉呀轉呀,轉了n就都沒反應。所以我就加上了這段。

  5、success。成功之後,呼叫顯示除錯資訊的函式,把除錯資訊給顯示出來。便於除錯和優化。

  6、defaultInfo。首先以傳遞過來的ajaxInfo為準,如果有了就按照ajaxInfo的來,如果沒有指定,就使用defaultInfo提供的對應屬性來賦值。就是一個預設值的作用。

  折騰的好處:

  一開始error裡面,沒有alert的提示,很不可思議吧,但是確實是沒有。後來想想還是加上吧,那麼我改一個地方就ok了,不需要到處都去改。後來又加上了停止載入動畫的功能,現在想想,是不是也要把顯示除錯資訊的給加上呢?有些錯誤也是會返回除錯資訊的呀。如果加的話,也是隻需要改一個地方就ok了。

  以前不知道cors,學會cors之後發現要附帶cookie的話,還要加上xhrFields,那好吧,就一個地方加上就行了,也不需要到處去改。

  總之,當變化發生的時候,我只需要改一個地方就ok了,我不需要到處去改,還容易漏掉某某。

ps:

這裡跳過了一個步驟,就是“快取”。不是ajax帶的cache,而是類似於本地儲存(Local Storage)的東東。這個以後會詳細說明。

相關推薦

ajax再次封裝(改進版) —— new與不 new 有啥區別?

  生命不息重構不止!   上一篇寫了一下我對ajax的再次封裝的方法,收到了很多有價值的回覆,比如有童鞋建議用$.extend,一開始還以為要做成外掛呢,後來才知道,原來這個東東還可以實現合併。省著自己再去做判斷了。   還有童鞋說“要不要多加點傳入引數”,這一下提醒我了,ajax有很多引數

ajax再次封裝

js的動態載入、快取、更新以及複用 系列有點卡文,放心會繼續的。先來點更基礎的,為js的載入做點鋪墊。   jQuery的ajax本來就很方便了,為啥還要在進一步的封裝呢?這個首先要看專案的具體需求了,如果覺得不需要,那麼完全可以直接用jQuery提供的各種ajax的方法。如果像我似地,感覺不太方便的話

原生ajax封裝ajax使用方法

alt 發出 框架 req 網站 原因 不變 textarea ajax 當我們不會寫後端接口來測試ajax時,我們可以使用node環境來模擬一個後端接口。 1、模擬後端接口可參考http://www.cnblogs.com/heyujun-/p/6793900.html網

ajax請求封裝調用

erro weight 網絡連接 line pre write cti color () /* * ajax請求封裝 */ function _ajax(url,data,callback){ try { $.ajax({

Ajax簡單封裝

ade get std 建立 配置信息 信息 回調函數 超文本 結果 學習Ajax時,雖然只是簡單學習,但是其中有get與post提交的方式,使用起來也沒有特別方便,所以將Ajax簡單封裝一下 首先需要了解Ajax的原理以及執行步驟, a1 頁面 發生事件 1 創建xhr

js之ajax封裝

con 開始 是否 需要 RR 執行 substr amp 字符串 上節講了ajax的作用好處即流程為的就是去封裝ajax,那......那該怎麽封裝ajax呢??????? 封裝方法,傳參是個很大的問題!在這裏,我們應該傳幾個參數呢?   首先我們肯定要傳一個請求方式ge

ajax封裝

對象 on() userinfo else cat get ESS 設置 brush 在我們很多網頁中為了更好的用戶體驗都會采用局部刷新和提交數據,今天我們就來講講這個"功法"是怎麽修煉的,"功法"的名稱叫做"ajax",其最大的優點是在不重新加載整個頁面的情況下,可以與服

再次升級阿裏雲Kubernetes日誌解決方案

日誌摘要: 今天阿裏雲Kubernetes日誌解決方案再次升級,為您帶來以下改進: 1、極致部署體驗:只需一條命令一個參數即可完成整個K8S集群的日誌解決方案部署。 2、支持更多配置方式:除原生控制臺、SDK配置方式外,支持通過CRD方式進行配置(kubectl、控制臺、K8S openapi)。背景針對K8

原生ajax 方法封裝

原生 操作 技術 取出 pan 數據 bsp 服務器 以及 封裝的技巧:將公共的代碼提取出來,將可能會變化的代碼,通過參數傳遞; 例如:請求服務器的方式、服務器地址、攜帶的參數、以及期望什麽類型的數據,都得通過參數傳遞:              下面是封裝的ajax

原生ajax封裝

手寫原生ajax ajax(url, data, method, success) { // 非同步物件 let ajax = new XMLHttpRequest(); // get 跟post 需要分

原生js---ajax封裝外掛.js---(對get和post做了相容)

function ajax(method,url,data,fn){ // 1、建立物件 var xhr=null; try{ xhr=new XMLHttpRequest(); }catch(e){ xhr=new ActiveXObject("Micr

dljd_011_jdbc再次封裝工具類_把數據庫的相關信息寫到配置文件中,減低代碼的耦合度

man 數據庫工具類 () version 數據庫配置 測試 loader connect not 一、將連接數據庫所需的相關信息寫入到配置文件、通過讀取配置文件來獲取數據庫的相關信息 package edu.aeon.aeonutils; import jav

重新更新謝謝大家的支援與關注再次感謝

大家好,我從16年開始做軟體開發,經過漫長歲月,忙的自己都沒有時間去更新部落格了,從Salesforce的二次開發再到商業軟體的應用,包括CRM,EHR,HCM,ERP,BI,OA,E-learing

jQuery·對ajax封裝

1.$.ajax() 作用:向伺服器傳送非同步請求,並且可以處理伺服器返回的資料 用法 $.ajax({ "url" : "請求的路徑", "data" : "請求的引數", "type" : "請求的方式(get/post

一個隊asp.net session進行了再次封裝的C#類的程式碼

將寫內容過程經常用到的內容片段做個收藏,下邊內容段是關於一個隊asp.net session進行了再次封裝的C#類的內容。 using System.Web; namespace DotNet.Utilities { public static class SessionHelper2

一個隊asp.net session進行了再次封裝的C#類的代碼

out time oid 再次 current web mes get pub 將寫內容過程經常用到的內容片段做個收藏,下邊內容段是關於一個隊asp.net session進行了再次封裝的C#類的內容。 using System.Web; namespace DotNe

jquery ajax fileinput封裝上傳外掛回撥方法

//上傳檔案 function fileInputUpload(id,url,successfn){ $("#"+id).fileinput({ language: 'zh', //設定語言 overwriteInitial: true, maxFileSize: 20480,

jquery.ajax函式封裝--通用

轉載:寫重複的方法 和程式碼,冗餘太大, 也浪費時間,找了一個通用的ajax,只需要傳引數就行 /***************************************************************** jQuery Ajax

JS學習之ajax相關知識和ajax封裝

/* URL 地址 method 請求的方式get/post dataType 返回的資料型別string/xml/json data 請求時候傳的資料(一個物件) succ

Intel推出10nm 3D新CPU架構,讓失效的摩爾定律再次生效

Intel在大洋彼岸的Architecture Day 2018活動中,公佈了多項重大產品訊息,最重要的訊息就是釋出了基於下一代Sunny Cove架構的10nm晶片,該CPU晶片將有望在2019年下半年開始出貨。 大會公佈了Sunny Cove架構細節和2