本發(fā)明涉及一種基于數(shù)據(jù)層的改進(jìn)ajax性能的方法。
背景技術(shù):
客戶端和服務(wù)端的通信有下面幾種方法:
Form表單的GET方法,只能在<form>元素中使用,參數(shù)編碼到url地址中,長度有限
Form表單的POST方法,只能在<form>元素中使用,參數(shù)在http header中發(fā)給服務(wù)器,數(shù)據(jù)量可以很大
Cookie,瀏覽器只是提供有限的接口,用于session會(huì)話場(chǎng)合。其它領(lǐng)域并不適合
Cgi方式,數(shù)據(jù)嵌入在頁面中一起返回給瀏覽器,完全不適合插件開發(fā)。
以及Ajax方式,其特點(diǎn)在于,html頁面可以在任何地方使用javascript向服務(wù)端發(fā)送ajax請(qǐng)求,同時(shí)注冊(cè)一個(gè)回調(diào)函數(shù)。Ajax是異步的,發(fā)送完ajax請(qǐng)求后頁面工作就結(jié)束,不用同步等待服務(wù)端的數(shù)據(jù)。當(dāng)瀏覽器收到服務(wù)器返回的數(shù)據(jù)后,瀏覽器就會(huì)自動(dòng)調(diào)用剛才注冊(cè)的回調(diào)函數(shù)。在回調(diào)函數(shù)中,程序員可以做任何事情,比如將數(shù)據(jù)顯示在html之中。
如果插件需要和服務(wù)端通信,Ajax是最好的選擇。因?yàn)閺脑O(shè)計(jì)的角度講,它將html和數(shù)據(jù)完全分開了,調(diào)試方便,功能強(qiáng)大,你可以在回調(diào)函數(shù)中做任何事情。
如果只是發(fā)送少數(shù)幾個(gè)數(shù)據(jù)請(qǐng)求,直接調(diào)用ajax的POST,或GET請(qǐng)求就可以了。但是如果要發(fā)送上百個(gè)請(qǐng)求,在復(fù)雜的插件中,這是完全可能的,直接調(diào)用就出現(xiàn)一些問題,我們需要一個(gè)數(shù)據(jù)層,封裝ajax,提供更強(qiáng)的通信功能。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種基于數(shù)據(jù)層的改進(jìn)ajax性能的方法。
本發(fā)明的目的是通過以下技術(shù)方案來實(shí)現(xiàn)的:一種基于數(shù)據(jù)層的改進(jìn)ajax性能的方法,包括初始化步驟、任務(wù)遷徙步驟、動(dòng)畫效果步驟,參數(shù)收集包括以下步驟:
所述的初始化步驟包括以下子步驟:
S11.創(chuàng)建數(shù)據(jù)層DataLayer,采用命名空間實(shí)現(xiàn),所述的命名空間采用json語法實(shí)現(xiàn);
S12.數(shù)據(jù)層將每個(gè)ajax視為一個(gè)任務(wù),并為其賦予一個(gè)任務(wù)編號(hào);其中,對(duì)于每一個(gè)任務(wù),數(shù)據(jù)層建立一張表格,維護(hù)每個(gè)任務(wù)的狀態(tài);
S13.數(shù)據(jù)層DataLayer提供一個(gè)函數(shù)接口send,參數(shù)為json對(duì)象;
所述的任務(wù)遷徙步驟包括以下子步驟:
S21:數(shù)據(jù)層收到客戶端向服務(wù)端發(fā)送的請(qǐng)求后,為任務(wù)分配一個(gè)id號(hào),將任務(wù)狀態(tài)設(shè)置為新建created;
S22:收集參數(shù),當(dāng)參數(shù)收集完畢,向服務(wù)端發(fā)送ajax請(qǐng)求,將任務(wù)狀態(tài)設(shè)置為waiting,同時(shí)超時(shí)計(jì)數(shù)器開始計(jì)數(shù);
S23:當(dāng)超時(shí)計(jì)數(shù)器計(jì)數(shù)結(jié)束之前,收到服務(wù)端返回的結(jié)果后,將任務(wù)狀態(tài)設(shè)置為finished;當(dāng)超時(shí)計(jì)數(shù)器計(jì)數(shù)結(jié)束服務(wù)端仍然沒有返回結(jié)果,任務(wù)將被終止,從waiting狀態(tài)直接進(jìn)入aborted狀態(tài);
所述的嵌入動(dòng)畫效果步驟為:
S31.使用absoulte布局,在Z軸最頂端加入div元素,div的visibility屬性設(shè)置為true,嵌入一個(gè)等待動(dòng)畫圖片;
S32.客戶調(diào)用send函數(shù)時(shí),數(shù)據(jù)層將actionprompt設(shè)置為true,數(shù)據(jù)層將顯示等待動(dòng)畫,如果actionprompt為false,將div的visibility屬性設(shè)置為false。
所述的json對(duì)象的結(jié)構(gòu)包括:
Actionid:由數(shù)據(jù)層datalayer自動(dòng)生成,表示任務(wù)編號(hào);
Actionstatus:表示任務(wù)的狀態(tài),包括創(chuàng)建、等待、終止、錯(cuò)誤;
Actionname:表示任務(wù)的名稱;
Actionprompt:表示是否出現(xiàn)文字和動(dòng)畫提示請(qǐng)求在處理中;
Maximumwaitingtime:表示一個(gè)任務(wù)最長的等待時(shí)間,超出這個(gè)等待時(shí)間而服務(wù)端沒有回應(yīng),數(shù)據(jù)層將終止任務(wù)運(yùn)行;
Callbacksuccess,表示用來注冊(cè)成功時(shí)候的回調(diào)函數(shù);
Callbackfail,表示用來注冊(cè)任務(wù)失敗時(shí)的回調(diào)函數(shù);
Waitingtip,當(dāng)?shù)却?wù)端回應(yīng)的時(shí)候,給予用戶的提示;
Url,指向服務(wù)端的地址,以所述的Actionname加上json后綴表示;
Atype,表示請(qǐng)求類型
Multi,表示能否重復(fù)請(qǐng)求的狀態(tài),當(dāng)設(shè)置為false時(shí)候,禁止改同一個(gè)任務(wù)在狀態(tài)處于create或者waitting時(shí)候反復(fù)發(fā)送。
所述的表格結(jié)構(gòu)包括
Actionid:表示任務(wù)編號(hào);
Actionname:表示任務(wù)的名稱;
Actionstatus:表示任務(wù)的狀態(tài),包括創(chuàng)建、等待、終止、錯(cuò)誤;
ajaxobj:ajax引用實(shí)例;
multi:表示能否重復(fù)請(qǐng)求的狀態(tài),當(dāng)設(shè)置為false時(shí)候,禁止改同一個(gè)任務(wù)在狀態(tài)處于create或者waitting時(shí)候反復(fù)發(fā)送:
injectedStatus:尾部是否置入特殊動(dòng)作。
它還包括一個(gè)瀏覽器版本判斷步驟:在每次任務(wù)狀態(tài)切換之后打印任務(wù)信息之前,判斷瀏覽器版本是否為console.log()函數(shù)所支持的版本,如果支持則調(diào)用console.log()函數(shù)進(jìn)行打印,否則不調(diào)用。
在所述的瀏覽器版本判斷步驟之后,還包括一個(gè)解析錯(cuò)誤狀態(tài)的轉(zhuǎn)換步驟:ie瀏覽器解析服務(wù)端返回的xml字符串出錯(cuò)的情況下,在ajax error屬性中注冊(cè)回調(diào)函數(shù),在這個(gè)函數(shù)中略過http頭,定位到xml數(shù)據(jù)體,將其轉(zhuǎn)換為jquery對(duì)象,將返回至客戶端。
所述的參數(shù)收集包括以下步驟:
S1.在數(shù)據(jù)層這個(gè)json對(duì)象中加入屬性currentActionID,指向任務(wù)表中正在處理的任務(wù)id;
S2.任務(wù)表中增加一列injectedStatus,表示是否已經(jīng)向任務(wù)處理動(dòng)作的末尾植入了一個(gè)特殊的動(dòng)作;
S3.然后將任務(wù)狀態(tài)設(shè)置為waiting即可;當(dāng)服務(wù)器返回?cái)?shù)據(jù)時(shí)候,在回調(diào)函數(shù)中,數(shù)據(jù)層將調(diào)用用戶注冊(cè)的回調(diào)函數(shù),然后將任務(wù)狀態(tài)設(shè)置為finished或者error;
S4.當(dāng)用戶調(diào)用send函數(shù)接口發(fā)送時(shí)候,數(shù)據(jù)層判斷currentActionID狀態(tài),如果是finished,或error,aborted,waiting表明沒有新建的任務(wù),
S5.數(shù)據(jù)層創(chuàng)建一個(gè)新任務(wù),狀態(tài)設(shè)置為created,將injectedStatus列置為true,然后執(zhí)行參數(shù)收集最核心的一個(gè)動(dòng)作,調(diào)用時(shí)間處理函數(shù),
S6.將時(shí)間處理函數(shù)添加到事件隊(duì)列末尾,同時(shí)將超時(shí)時(shí)間設(shè)置為0秒;
S7.這樣一系列的send函數(shù)調(diào)用一結(jié)束時(shí),這個(gè)時(shí)間處理函數(shù)將被調(diào)用,請(qǐng)求將被發(fā)送出去。
本發(fā)明的有益效果是:一種基于數(shù)據(jù)層的改進(jìn)ajax性能的方法,提升了ajax對(duì)IE瀏覽器的兼容性,彌補(bǔ)了IE瀏覽器對(duì)XML數(shù)據(jù)解析的不正確的缺點(diǎn),同時(shí)在等待服務(wù)器響應(yīng)的時(shí)候提供一個(gè)動(dòng)畫提示用戶,告知用戶當(dāng)前任務(wù)的狀態(tài),并且用戶可以任意組合參數(shù),數(shù)據(jù)層自動(dòng)判斷參數(shù)是否填寫完畢,然后發(fā)出請(qǐng)求,使編程接口更加友好,在客戶端可以制作一個(gè)數(shù)據(jù)就發(fā)送一個(gè)請(qǐng)求,不需要將所有的數(shù)據(jù)都制作完再發(fā)送。
附圖說明
圖1為狀態(tài)遷移圖;
具體實(shí)施方式
下面結(jié)合附圖進(jìn)一步詳細(xì)描述本發(fā)明的技術(shù)方案:一種基于數(shù)據(jù)層的改進(jìn)ajax性能的方法,包括初始化步驟、任務(wù)遷徙步驟、動(dòng)畫效果步驟包括以下步驟:
所述的初始化步驟包括以下子步驟:
S11.創(chuàng)建數(shù)據(jù)層DataLayer,采用命名空間實(shí)現(xiàn),所述的命名空間采用json語法實(shí)現(xiàn);
S12.數(shù)據(jù)層將每個(gè)ajax視為一個(gè)任務(wù),并為其賦予一個(gè)任務(wù)編號(hào);其中,對(duì)于每一個(gè)任務(wù),數(shù)據(jù)層建立一張表格,維護(hù)每個(gè)任務(wù)的狀態(tài);
S13.數(shù)據(jù)層DataLayer提供一個(gè)函數(shù)接口send,參數(shù)為json對(duì)象;
如圖1所示,所述的任務(wù)遷徙步驟包括以下子步驟:
S21:數(shù)據(jù)層收到客戶端向服務(wù)端發(fā)送的請(qǐng)求后,為任務(wù)分配一個(gè)id號(hào),將任務(wù)狀態(tài)設(shè)置為新建created;
S22:收集參數(shù),當(dāng)參數(shù)收集完畢,向服務(wù)端發(fā)送ajax請(qǐng)求,將任務(wù)狀態(tài)設(shè)置為waiting,同時(shí)超時(shí)計(jì)數(shù)器開始計(jì)數(shù);
S23:當(dāng)超時(shí)計(jì)數(shù)器計(jì)數(shù)結(jié)束之前,收到服務(wù)端返回的結(jié)果后,將任務(wù)狀態(tài)設(shè)置為finished;當(dāng)超時(shí)計(jì)數(shù)器計(jì)數(shù)結(jié)束服務(wù)端仍然沒有返回結(jié)果,任務(wù)將被終止,從waiting狀態(tài)直接進(jìn)
入aborted狀態(tài);
所述的嵌入動(dòng)畫效果步驟為:
S31.使用absoulte布局,在Z軸最頂端加入div元素,div的visibility屬性設(shè)置為true,嵌入一個(gè)等待動(dòng)畫圖片;
S32.客戶調(diào)用send函數(shù)時(shí),數(shù)據(jù)層將actionprompt設(shè)置為true,數(shù)據(jù)層將顯示等待動(dòng)畫,如果actionprompt為false,將div的visibility屬性設(shè)置為false。
通過上傳自定義的字符串來決定顯示的文字信息;
同時(shí)在等待服務(wù)器響應(yīng)的時(shí)候提供一個(gè)動(dòng)畫和文字信息來提示用戶,告知用戶當(dāng)前任務(wù)的狀態(tài),
所述的json對(duì)象的結(jié)構(gòu)包括:
Actionid:由數(shù)據(jù)層datalayer自動(dòng)生成,表示任務(wù)編號(hào);
Actionstatus:表示任務(wù)的狀態(tài),包括創(chuàng)建、等待、終止、錯(cuò)誤;
Actionname:表示任務(wù)的名稱;
Actionprompt:表示是否出現(xiàn)文字和動(dòng)畫提示請(qǐng)求在處理中;
Maximumwaitingtime:表示一個(gè)任務(wù)最長的等待時(shí)間,超出這個(gè)等待時(shí)間而服務(wù)端沒有回應(yīng),數(shù)據(jù)層將終止任務(wù)運(yùn)行;
Callbacksuccess,表示用來注冊(cè)成功時(shí)候的回調(diào)函數(shù);
Callbackfail,表示用來注冊(cè)任務(wù)失敗時(shí)的回調(diào)函數(shù);
Waitingtip,當(dāng)?shù)却?wù)端回應(yīng)的時(shí)候,給予用戶的提示;
Url,指向服務(wù)端的地址,以所述的Actionname加上json后綴表示;
Atype,表示請(qǐng)求類型
Multi,表示能否重復(fù)請(qǐng)求的狀態(tài),當(dāng)設(shè)置為false時(shí)候,禁止改同一個(gè)任務(wù)在狀態(tài)處于create或者waitting時(shí)候反復(fù)發(fā)送。
表1
如表1所示,所述的表格結(jié)構(gòu)包括:
Actionid:表示任務(wù)編號(hào);
Actionname:表示任務(wù)的名稱;
Actionstatus:表示任務(wù)的狀態(tài),包括創(chuàng)建、等待、終止、錯(cuò)誤;
ajaxobj:ajax引用實(shí)例;
multi:表示能否重復(fù)請(qǐng)求的狀態(tài),當(dāng)設(shè)置為false時(shí)候,禁止改同一個(gè)任務(wù)在狀態(tài)處于create或者waitting時(shí)候反復(fù)發(fā)送:
injectedStatus:尾部是否置入特殊動(dòng)作。
它還包括一個(gè)瀏覽器版本判斷步驟:在每次任務(wù)狀態(tài)切換之后打印任務(wù)信息之前,判斷瀏覽器版本是否為console.log()函數(shù)所支持的版本,如果支持則調(diào)用console.log()函數(shù)進(jìn)行打印,否則不調(diào)用。
在所述的瀏覽器版本判斷步驟之后,還包括一個(gè)解析錯(cuò)誤狀態(tài)的轉(zhuǎn)換步驟:ie瀏覽器解析服務(wù)端返回的xml字符串出錯(cuò)的情況下,在ajax error屬性中注冊(cè)回調(diào)函數(shù),在這個(gè)函數(shù)中略過http頭,定位到xml數(shù)據(jù)體,將其轉(zhuǎn)換為jquery對(duì)象,將返回至客戶端,
所述的瀏覽器版本判斷步驟提升了ajax對(duì)IE瀏覽器的兼容性和解析錯(cuò)誤狀態(tài)的轉(zhuǎn)換步驟彌補(bǔ)了IE瀏覽器對(duì)XML數(shù)據(jù)解析的不正確的缺點(diǎn)。
所述的參數(shù)收集包括以下步驟:
S1.在數(shù)據(jù)層這個(gè)json對(duì)象中加入屬性currentActionID,指向任務(wù)表中正在處理的任務(wù)id;
S2.任務(wù)表中增加一列injectedStatus,表示是否已經(jīng)向任務(wù)處理動(dòng)作的末尾植入了一個(gè)特殊的動(dòng)作;
S3.然后將任務(wù)狀態(tài)設(shè)置為waiting即可;當(dāng)服務(wù)器返回?cái)?shù)據(jù)時(shí)候,在回調(diào)函數(shù)中,數(shù)據(jù)層將調(diào)用用戶注冊(cè)的回調(diào)函數(shù),然后將任務(wù)狀態(tài)設(shè)置為finished或者error;
S4.當(dāng)用戶調(diào)用send函數(shù)接口發(fā)送時(shí)候,數(shù)據(jù)層判斷currentActionID狀態(tài),如果是finished,或error,aborted,waiting表明沒有新建的任務(wù),
S5.數(shù)據(jù)層創(chuàng)建一個(gè)新任務(wù),狀態(tài)設(shè)置為created,將injectedStatus列置為true,然后執(zhí)行參數(shù)收集最核心的一個(gè)動(dòng)作,調(diào)用時(shí)間處理函數(shù),
S6.將時(shí)間處理函數(shù)添加到事件隊(duì)列末尾,同時(shí)將超時(shí)時(shí)間設(shè)置為0秒;
S7.這樣一系列的send函數(shù)調(diào)用一結(jié)束時(shí),這個(gè)時(shí)間處理函數(shù)將被調(diào)用,請(qǐng)求將被發(fā)送出去。
因?yàn)楫?dāng)下一個(gè)send被調(diào)用時(shí),因injectedStatus為true,特殊動(dòng)作不會(huì)再植入到末尾使得用戶可以任意組合參數(shù),數(shù)據(jù)層自動(dòng)判斷參數(shù)是否填寫完畢,然后發(fā)出請(qǐng)求,使編程接口更加友好,在客戶端可以制作一個(gè)數(shù)據(jù)就發(fā)送一個(gè)請(qǐng)求,不需要將所有的數(shù)據(jù)都制作完再發(fā)送。