ajax的再次封裝!(改進版) —— new與不 new 有啥區別?
生命不息重構不止!
上一篇寫了一下我對ajax的再次封裝的方法,收到了很多有價值的回覆,比如有童鞋建議用$.extend,一開始還以為要做成外掛呢,後來才知道,原來這個東東還可以實現合併。省著自己再去做判斷了。
還有童鞋說“要不要多加點傳入引數”,這一下提醒我了,ajax有很多引數呀,常用的我考慮進來了,但是還有很多不常用的呢,如果需要的話怎麼辦?在看看我呼叫原生ajax的方式,kao,完全不支援增加其他引數嗎,這怎麼行,改一定要改。於是就改成了這樣。
1 //對ajax的封裝 //最基礎的一層封裝 2 Nature.Ajax = function(ajaxInfo) {3 4 //定義預設值 5 //type: "GET", //訪問方式:如果dataPata不為空,自動設定為POST;如果為空設定為GET。 6 //dataType: Nature.AjaxConfig.ajaxDataType, //資料型別:JSON、JSONP、text 7 //cache: true, //是否快取,預設快取 8 //urlPara: {},//url後面的引數。一定會加在url後面,不會加到form裡。 9 //formData: {},//表單裡的引數。如果dataType是JSON,一定加在form裡,不會加在url後面;如果dataType是JSONP的話,只能加在url後面。10 //url: //依靠上層指定 11 12 //補全ajaxInfo 13 //dataType 14 if (typeof ajaxInfo.dataType == "undefined") ajaxInfo.dataType = Nature.AjaxConfig.ajaxDataType; 15 //cache 16 if (typeof ajaxInfo.cache == "undefined") ajaxInfo.cache = false; 17 18 //type 19 if (typeof ajaxInfo.formData == "undefined") {20 ajaxInfo.type = "GET"; 21 } else { 22 ajaxInfo.type = "POST"; 23 ajaxInfo.data = ajaxInfo.formData; 24 } 25 26 //處理URL和引數 27 if (typeof ajaxInfo.urlPara != "undefined") { 28 var tmpUrlPara = ""; 29 var para = ajaxInfo.urlPara; 30 for (var key in para) { 31 tmpUrlPara += "&" + key + "=" + para[key]; 32 } 33 34 if (ajaxInfo.url.indexOf('?') >= 0) { 35 //原地址有引數,直接加 36 ajaxInfo.url += tmpUrlPara; 37 } else { 38 //原地址沒有引數,變成?再加 39 ajaxInfo.url += tmpUrlPara.replace('&', '?'); 40 } 41 } 42 43 //處理xhrFields 44 if (typeof ajaxInfo.xhrFields == "undefined") { 45 ajaxInfo.xhrFields = { 46 //允許cors跨域訪問時新增cookie 47 withCredentials: true 48 }; 49 } else { 50 if (typeof ajaxInfo.xhrFields.withCredentials == "undefined") { 51 ajaxInfo.xhrFields.withCredentials = true; 52 } 53 } 54 55 //處理error 56 var error = ajaxInfo.error; 57 ajaxInfo.error = function(request, textStatus, errorThrown) { 58 //訪問失敗,自動停止載入動畫,並且給出提示 59 alert("提交" + ajaxInfo.title + "的時候發生錯誤!"); 60 if (typeof top.spinStop != "undefined") 61 top.spinStop(); 62 if (typeof error == "function") error(); 63 }; 64 65 //處理success 66 var success = ajaxInfo.success; 67 ajaxInfo.success = function(data) { 68 //顯示除錯資訊 69 if (typeof(parent.DebugSet) != "undefined") 70 parent.DebugSet(data.debug); 71 72 if (typeof(ajaxInfo.ctrlId) == "undefined") 73 success(data); 74 else { 75 success(ajaxInfo.ctrlId, data); 76 } 77 }; 78 79 //開始執行ajax 80 $.ajax(ajaxInfo); 81 };
雖然還是隻有一個引數,但是這個引數是一個集合。可以包含很多的元素(屬性)。改進後完全以這個引數為主,進行預設的屬性設定,最後直接把這個引數傳遞給原生ajax,這樣呼叫的時候,可以根據ajax的規則來設定自己需要的屬性了。
另外去掉了 defaultInfo。因為看來看去,就是一個Nature.sendDataType 算是預設值,其他的都不算了。所以乾脆去掉吧。改進後既可以很方便的呼叫,也確保了其擴充套件性,可以增加其他的屬性。
1 var ajax = Nature.Ajax; 2 3 ajax({ 4 url:"", 5 formData: jsonValue, 6 urlPara: ajaxUrlPara, 7 title: "儲存資料", 8 success: function(data) { 9 if (data.err.length == 0) { 10 alert("儲存成功!"); 11 //清空表單 12 13 } else { 14 alert(data.err); 15 } 16 17 if (typeof callback == "function") { 18 callback(); 19 } 20 21 } 22 });
好像還是要寫不少東東,但是仔細看看的話,可以發現有很多優勢,首先明確了哪些引數用url傳遞,哪些引數用表單post傳遞。error有了統一的處理,蘇測試時success了也可以統一顯示除錯資訊。不用去考慮是post還是get是json還是jsonp,這些都會統一處理。
最後涉及到了一個併發的問題,因為我想實現“複用”,這個函式會被載入到top頁面裡,其他的子頁面都會到top裡呼叫這個函式,那麼如果同時開啟兩個iframe,一起載入,併發了怎麼辦?會不會產生衝突?如果new的話,併發的時候肯定不會產生衝突,但是jQuery的ajax似乎沒有new,那麼他是如何處理併發的呢?
我是實踐派,遇到問題了首先想到的是寫點程式碼測試一下,然後再去找找原理和理論。於是我就寫了個程式碼模擬測試一下,看看併發的情況。
1 var state = 1; 2 3 function fun1(para, timestep) { 4 var temp = para.a1;//內部變數 5 6 para.a1 = para.a1 * 100;//修改引數看看 7 8 this.time = timestep;//這個不new的時候能用嗎? 9 10 var self = this;//setTimeout裡面用不了這個this,那麼江湖規矩。 11 12 state ++;//全域性變數,不解釋 13 14 window.setTimeout(function() { //模擬回撥 15 console.log(para.name); 16 console.log("para.a1 : " + para.a1); 17 console.log("temp:" + temp); 18 console.log("this.time: " + self.time); 19 20 21 },timestep); 22 } 23 24 fun1({ name: "aa1",a1:10 }, 1000); 25 fun1({ name: "aa2", a1: 20 }, 100); 26 27 var f1 = new fun1({ name: "aa3", a1: 30 }, 10);
大家猜猜輸出結果是啥?
相關推薦
ajax的再次封裝!(改進版) —— new與不 new 有啥區別?
生命不息重構不止! 上一篇寫了一下我對ajax的再次封裝的方法,收到了很多有價值的回覆,比如有童鞋建議用$.extend,一開始還以為要做成外掛呢,後來才知道,原來這個東東還可以實現合併。省著自己再去做判斷了。 還有童鞋說“要不要多加點傳入引數”,這一下提醒我了,ajax有很多引數
C++類和物件詳解(new與不new的區別)
一、"類" 的介紹 在C++中, 用 "類" 來描述"物件", 所謂的"物件"是指現實世界中的一切事物。那麼類就可以看做是對相似事物的抽象, 找到這些不同事物間的共同點, 如自行車和摩托車, 首先他們都屬於"物件", 並且具有一定得相同點, 和一些不同點, 相同點如
C++之建立物件時的new與不new
C++在建立物件的時候可以採用兩種方式:(例如類名為Test) Test test 或者 Test* pTest = new Test()。 這兩種方法都可以例項化一個物件,但是這兩種方法有很大的區別,區別在於物件內容所在的記憶體空間不同,
條件覆蓋與分支覆蓋有啥區別
我們首先來看一下這幾些測試覆蓋的定義: 定義一、 語句覆蓋:它要求被測程式的每一可執行語句在測試中儘可能都檢驗過; 定義二、分支覆蓋:要求程式中所有判定的分支儘可能得到檢驗; 定義三、條件覆蓋:當判定式中含有多個條件時,要求每個條件的取值均得到檢驗; 從這些定義我們可以很容
C#中null與string.Empty有啥區別
當你只定義一個str而不為其分配記憶體時用string str=null,但是在接下來你使用它之前必須為它賦值如str=“xxxx”也就是為它初始化 而string str= string.Empty是定義和初始化放在了一起它實際是等價於string str=null;st
$(document).ready(function() {});寫與不寫有什麼區別
不寫$(document).ready(function() {});,直接在<script></script>中寫事件,方法可以嗎? $(document).ready 裡的程式碼是在頁面內容都載入完才執行的,你直接寫到script標籤裡,當頁面
Transaction之坑:Spring中配置Transaction與不配置有何區別
首先 Spring中 Transaction管理 配置有兩種方式: Annotation式:@Transactional Xml式:<tx:method /> Not
三子棋改進版——增加與人對決!!
三子棋 函式分為三部分 1.test.c檔案 2.game.h檔案 3.game.c檔案 改進思想:1.增加了人與人對決的man_game( )函式從而增加了一點小功能,使得玩家的選擇變得更加廣泛。 2.men_game函式與game函式功能完全相同;只是分別呼
ajax的再次封裝!
js的動態載入、快取、更新以及複用 系列有點卡文,放心會繼續的。先來點更基礎的,為js的載入做點鋪墊。 jQuery的ajax本來就很方便了,為啥還要在進一步的封裝呢?這個首先要看專案的具體需求了,如果覺得不需要,那麼完全可以直接用jQuery提供的各種ajax的方法。如果像我似地,感覺不太方便的話
C++——創建類的時候用new與不用new 的區別
delet 註意 我們 兩種 多少 內存泄露 start 配方 sdn 轉自:https://www.cnblogs.com/tony-li/p/4111588.html C++在創建對象的時候可以采用兩種方式:(例如類名為Test) Test test 或者 Test*
深入講解Go語言中函式new與make的使用和區別
深入講解Go語言中函式new與make的使用和區別 大家都知道Go語言中的函式new與函式make一直是新手比較容易混淆的東西,看著相似,但其實不同,不過解釋兩者之間的不同也非常容易,下面這篇文章主要給大家介紹了關於Go語言中函式new與make區別的相關資料
C++——建立類的時候用new與不用new 的區別(從堆和棧的解讀)
轉自:https://www.cnblogs.com/tony-li/p/4111588.html C++在建立物件的時候可以採用兩種方式:(例如類名為Test) Test test 或者 Test* pTest = new Test()。 這兩
new與malloc的10點區別
閱讀目錄 new與malloc的10點區別 1. 申請的記憶體所在位置 2.返回型別安全性 3.記憶體分配失敗時的返回值 4.是否需要指定記憶體大小 5.是否呼叫建構函式/解構函式 6.對陣列的處理 7.n
JAVA中陣列初始化時用new與不用new有區別嗎
不同於String類,String由於實現了常量池 所以new 和不new 有區別:new的話,引用變數指向堆區。不new的話,引用變數指向常量池。對於陣列的定義,初始化時用new與不用new 沒區別,
基礎備忘:細說new與malloc的10點區別
正文 回到頂部 前言 幾個星期前去面試C++研發的實習崗位,面試官問了個問題: new與malloc有什麼區別? 這是個老生常談的問題。當時我回答new從自由儲存區上分配記憶體,malloc從堆上分配記憶體;new/delete會呼叫建構函式/解構函式對
C++中的new、operator new與placement new
[http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html] C++中的new/delete與operator new/operator delete new operator/delete oper
C/C++——C++中new與malloc的10點區別
前言 幾個星期前去面試C++研發的實習崗位,面試官問了個問題: new與malloc有什麼區別? 這是個老生常談的問題。當時我回答new從自由儲存區上分配記憶體,malloc從堆上分配記憶體;new/delete會呼叫建構函式/解構函式對物件進行初始化與銷燬;
C++——建立類的時候用new與不用new 的區別(轉)
C++在建立物件的時候可以採用兩種方式:(例如類名為Test) Test test 或者 Test* pTest =
MySQL中使用索引與不使用索引的區別
pan 並發 並發數 table def ring primary innodb zab 為了回答索引對數據庫性能的影響,做了一次簡單的實驗。 測試環境 MySQL 5.7.10 innodb 100萬隨機數據 表結構 CREATE TABLE `
js調用函數時加括號與不加括號的區別
調用函數 執行 查看 return 區別 代碼 調用 dem 部分 函數名其實就是指向函數體的指針 不加括號, 可以認為是查看該函數的完整信息, 不加括號傳參,相當於傳入函數整體 加括號 表示立即調用(執行)這個函數裏面的代碼(花括號部分的代碼) 例2: functio