自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基本的封裝Ajax之一

開(kāi)發(fā) 后端
AJAX并非縮寫(xiě)詞,是一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)。本文主要介紹的是創(chuàng)建一個(gè)基本的Ajax的步驟,讓我們一起來(lái)看。

Ajax,或許已經(jīng)是老掉牙的話(huà)題。我學(xué)習(xí)總結(jié)一下。大概會(huì)有6篇,從基本的Ajax直至高級(jí)的應(yīng)用。***會(huì)形成一個(gè)實(shí)用的Ajax工具庫(kù)。

創(chuàng)建一個(gè)基本的Ajax應(yīng)用不需要太多的代碼,大概三個(gè)步驟,幾十行代碼即可。

1,創(chuàng)建Ajax的核心對(duì)象XMLHttpRequest

因?yàn)闉g覽器之間的不兼容,IE7之前的版本并沒(méi)有原生的XMLHttpRequest對(duì)象卻實(shí)現(xiàn)為ActiveX對(duì)象。
互聯(lián)網(wǎng)及各種書(shū)籍中有著多種創(chuàng)建方式,有的復(fù)雜很多行代碼,有的則簡(jiǎn)潔很少代碼。當(dāng)然復(fù)雜的考慮的情形更多一些。如下幾乎將IE中所有的情況都考慮到了。

  1. function cretaeXHR(){   
  2. tryreturn new XMLHttpRequest();}catch(e){}   
  3. tryreturn new ActiveXObject('Msxml2.XMLHTTP.6.0');}catch(e){}   
  4. tryreturn new ActiveXObject('Msxml2.XMLHTTP.4.0');}catch(e){}   
  5. tryreturn new ActiveXObject('Msxml2.XMLHTTP.3.0');}catch(e){}   
  6. tryreturn new ActiveXObject('Msxml2.XMLHTTP');}catch(e){}   
  7. tryreturn new ActiveXObject('MSXML3.XMLHTTP');}catch(e){}   
  8. tryreturn new ActiveXObject('MSXML.XMLHTTP');}catch(e){}   
  9. tryreturn new ActiveXObject('Microsoft.XMLHTTP');}catch(e){}   
  10. tryreturn new ActiveXObject('MSXML2.ServerXMLHTTP');}catch(e){}   
  11. return null;   
  12. }  

代碼較少的采用對(duì)象特性判斷,

  1. var xhr = window.XMLHttpRequest ? new XMLHttpRequest() :new ActiveXObject('Microsoft.XMLHTTP');  

我在這里采用精簡(jiǎn)方式,暫不考慮創(chuàng)建異常的情況。

2,發(fā)送請(qǐng)求

  1. xhr.open   
  2. xhr.send  

3,處理響應(yīng)

  1. xhr.onreadystatechange = function(){   
  2. if(xhr.readyState == 4){   
  3. if(xhr.status == 200){//當(dāng)然你可以把200~300之間或304的都理解成響應(yīng)成功   
  4. //callback   
  5. }   
  6. }   
  7. }  

嗯,到這里沒(méi)什么特別的,所有的書(shū)籍上都是這么幾個(gè)步驟來(lái)著。對(duì)于初學(xué)者來(lái)說(shuō),要將這幾個(gè)步驟很好的封裝一下形成一個(gè)良好的模塊還是很困難的。全局變量滿(mǎn)天飛不知道怎么去組織代碼,初學(xué)者開(kāi)始都是這樣的?,F(xiàn)在想想是對(duì)一門(mén)語(yǔ)言沒(méi)有足夠的掌握,尤其是閉包。

這里采用 單例模式 封裝成一個(gè)對(duì)象,即只有一個(gè)全局的變量將其賦值給Ajax,該對(duì)象有一個(gè)request方法。request有兩個(gè)參數(shù),***個(gè)為請(qǐng)求的url(必要的),字符串類(lèi)型,第二個(gè)opt為配置參數(shù)(可選的),對(duì)象類(lèi)型。結(jié)果處理使用內(nèi)部私有的_onStateChange函數(shù)。

完整代碼如下:

  1. /**   
  2. * 執(zhí)行基本ajax請(qǐng)求,返回XMLHttpRequest   
  3. * Ajax.request(url,{   
  4. * async 是否異步 true(默認(rèn))   
  5. * method 請(qǐng)求方式 POST or GET(默認(rèn))   
  6. * data 請(qǐng)求參數(shù) (鍵值對(duì)字符串)   
  7. * success 請(qǐng)求成功后響應(yīng)函數(shù),參數(shù)為xhr   
  8. * failure 請(qǐng)求失敗后響應(yīng)函數(shù),參數(shù)為xhr   
  9. * });    
  10. */   
  11. Ajax =   
  12. function(){   
  13. function request(url,opt){   
  14. function fn(){}   
  15. var async = opt.async !== false,   
  16. method = opt.method || 'GET',   
  17. data = opt.data || null,   
  18. success = opt.success || fn,   
  19. failure = opt.failure || fn;   
  20. method = method.toUpperCase();   
  21. if(method == 'GET' && data){   
  22. url += (url.indexOf('?') == -1 ? '?' : '&') + data;   
  23. data = null;   
  24. }   
  25. var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');   
  26. xhr.onreadystatechange = function(){   
  27. _onStateChange(xhr,success,failure);   
  28. };   
  29. xhr.open(method,url,async);   
  30. if(method == 'POST'){   
  31. xhr.setRequestHeader('Content-type''application/x-www-form-urlencoded;');   
  32. }   
  33. xhr.send(data);   
  34. return xhr;   
  35. }   
  36. function _onStateChange(xhr,success,failure){   
  37. if(xhr.readyState == 4){   
  38. var s = xhr.status;   
  39. if(s>= 200 && s < 300){   
  40. success(xhr);   
  41. }else{   
  42. failure(xhr);   
  43. }   
  44. }else{}   
  45. }   
  46. return {request:request};   
  47. }();  

如下請(qǐng)求后臺(tái)的一個(gè)servlet,發(fā)送參數(shù)name=jack,age=20,默認(rèn)使用異步,GET方式

  1. Ajax.request('servlet/ServletJSON',{    
  2.          data : 'name=jack&age=20',    
  3.         success : function(xhr){    
  4.              //to do with xhr    
  5.         },    
  6.          failure : function(xhr){    
  7.              //to do with xhr    
  8. }    
  9. }    
  10. );   

以上是一個(gè)簡(jiǎn)單封裝,用了不到40行的代碼。這里的請(qǐng)求參數(shù)data只能是鍵值字符串,有時(shí)候希望可以JS對(duì)象,以便可以更靈活的傳參,下一篇將從改善請(qǐng)求參數(shù)開(kāi)始。

【編輯推薦】

  1. 使用 jQuery 簡(jiǎn)化 Ajax 開(kāi)發(fā)
  2. 外國(guó)設(shè)計(jì)大師Ajax之父74張圖詳談?dòng)脩?hù)體驗(yàn)的要素
  3. 在AJAX開(kāi)發(fā)中集成數(shù)據(jù)庫(kù)技術(shù)
  4. Ajax和WEB服務(wù)數(shù)據(jù)格式:自定義返回格式
責(zé)任編輯:于鐵 來(lái)源: 博客園
相關(guān)推薦

2012-03-15 16:12:57

JavaHashMap

2021-07-06 06:12:43

Shell語(yǔ)法變量

2021-10-30 18:38:49

Java c++反射

2011-08-03 09:37:55

云計(jì)算

2011-04-11 15:53:40

C++

2021-02-04 15:08:37

Vue漸進(jìn)式框架

2011-06-16 13:45:14

2009-01-13 14:37:17

WinForm視頻教程MVP

2021-12-15 08:26:03

TCASwiftUIUIKit

2023-11-30 07:45:11

useEffectReact

2012-08-28 09:21:59

Ajax查錯(cuò)經(jīng)歷Web

2021-06-03 19:55:55

MySQ查詢(xún)優(yōu)化

2010-06-04 17:43:20

MySQL綠色安裝

2017-03-27 21:59:57

TDD開(kāi)發(fā)編程

2022-03-15 15:24:53

操作系統(tǒng)RTOSAT模塊

2022-01-13 14:01:39

Rfid克隆防護(hù)

2023-03-31 11:21:10

網(wǎng)絡(luò)協(xié)議LoRaWAN

2021-08-30 09:30:29

Kafka高性能設(shè)計(jì)

2009-09-01 11:20:11

Struts 2AJAX支持

2021-05-06 05:39:30

Inotify監(jiān)聽(tīng)系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)