JAVA

          人生若只如初見,何事秋風悲畫扇。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            50 隨筆 :: 25 文章 :: 157 評論 :: 0 Trackbacks

            這二天用prototype.js中的ajax.request做了些東西,閑時看了下源碼,體會如下:

            在用AJAX部分前,有如下一些函數(shù)得了解一下:
            Class變量

          var ?Class? = ? {
          ??create:?
          function ()? {
          ????
          return ? function ()? {
          ??????
          this .initialize.apply( this ,?arguments);
          ????}

          ??}

          }


            initialize相當于構造器,和java的構造器一樣,可以自定義為帶參數(shù)性質的。prototype中很多對象都是用它來創(chuàng)建的,ajax也不例外。

          Try.these() 方法

          var ?Try? = ? {
          ??these:?
          function ()? {
          ????
          var ?returnValue;

          ????
          for ?( var ?i? = ? 0 ;?i? < ?arguments.length;?i ++ )? {
          ??????
          var ?lambda? = ?arguments[i];
          ??????
          try ? {
          ????????returnValue?
          = ?lambda();
          ????????
          break ;
          ??????}
          ? catch ?(e)? {}
          ????}


          ????
          return ?returnValue;
          ??}

          }


            它使得實現(xiàn)當你想調(diào)用不同的方法直到其中的一個成功正常的這種需求變得非常容易, 他把一系列的方法作為參數(shù)并且按順序的一個一個的執(zhí)行這些方法直到其中的一個成功執(zhí)行,返回成功執(zhí)行的那個方法的返回值。
            ajax就是通過它得到一個可以跨borswer的xmlhttp的:

          var ?Ajax? = ? {
          ??getTransport:?
          function ()? {
          ????
          return ?Try.these(
          ??????
          function ()? { return ? new ?ActiveXObject('Msxml2.XMLHTTP')} ,
          ??????
          function ()? { return ? new ?ActiveXObject('Microsoft.XMLHTTP')} ,
          ??????
          function ()? { return ? new ?XMLHttpRequest()}
          ????)?
          || ? false ;
          ??}


          ??activeRequestCount:?
          0
          }


          Object.extend方法:

          Object.extend? = ? function (destination,?source)? {
          ??
          for ?(property? in ?source)? {
          ????destination[property]?
          = ?source[property];
          ??}

          ??
          return ?destination;
          }


            顧名思義,可正擴展了一個對象屬性列表。這樣說可能不太明白,結合Ajax再下就清楚了,如下,

          Ajax.Base.prototype? = ? {
          ??setOptions:?
          function (options)? {
          ????
          this .options? = ? {
          ??????method:???????'post',
          ??????asynchronous:?
          true ,
          ??????parameters:???''
          ????}

          ????Object.extend(
          this .options,?options? || ? {} );
          ??}
          ,
          ???
          }


            可以看到在prototype中用ajax的時候,它的options默認有三個,默認值如上所示。這里可以通過以下方式來改變其默值(Ajax.Request的用法,呆會兒再看):

          var ?pars? = ?'method = update & mbid = 917 ';
          var ?my? = ? new ?Ajax.Request(
          ?uri,?
          ?
          {
          ??method:?'post',
          ??parameters:?pars,
          ??asynchronous:?
          false ,
          ?}
          );
          }

            這時有個問題可能不太好處理,假如想增加其它參數(shù),怎么知道我所增加的參數(shù)是否符合prototype呢?確實!比如我想通過send方法傳一段數(shù)據(jù)到后臺,該用什么參數(shù)呢?在prototype中有如下代碼:

          var ?body? = ? this .options.postBody? ? ? this .options.postBody?:?parameters;
          this .transport.send( this .options.method? == ?'post'? ? ?body?:? null );


            可以看到應該是postBody,對于prototype中的參數(shù)以及其所代表的意義我想還是得通過源文件一個個的找。作者并沒有初始一個集合(廢話,不然也不要Object.extend方法了)。我覺得這個地方有待改進... ...

            在send時方法一定要用post才能生效,這個時候parameters就會失效了,源碼如下:

          if ?( this .options.method? == ?'get'? && ?parameters.length? > ? 0 )
          ????????
          this .url? += ?( this .url.match( / \ ?/ )? ? ?' & '?:?' ? ')? + ?parameters;


            所以假如后臺一定要一個parameter的話,比如若用到Struts的LookupDispatchAction就很可能要一個method參數(shù)。這時應該直接放到uri中去,最后要注意的一點就是用post的時候,一定要將響應頭設置成Content-type==application/x-www-form-urlencoded. 好在prototype已經(jīng)考慮到了這點:

          this .setRequestHeaders(); // 其具體代碼可以看源文件
          var ?body? = ? this .options.postBody? ? ? this .options.postBody?:?parameters;
          this .transport.send( this .options.method? == ?'post'? ? ?body?:? null );


            在這兒我說一下我在使用ajax過程中遇到亂碼的解決方法:
            從C到S頭端時,在S端接到的是亂碼解決分析過程。首先要明白AJAX內(nèi)部是以utf-8來編碼傳輸數(shù)據(jù)的。我們在頁面所看到的數(shù)據(jù)都是按照我們自己預定的字符集解碼所得到的。OK,現(xiàn)在假設我們在S端收到了來自C端的DATA為亂碼,在C端(不管你的WEB頁面是用什么編碼方式)AJAX在其傳輸中把所傳輸?shù)臄?shù)據(jù)解碼成UTF-8格式,到了S端后,我可能對所有請求方式都過濾編碼,比如有如下設置:

          < filter >
          ??
          < filter-name > encodingFilter </ filter-name >
          ??
          < filter-class >
          ???com.CharacterEncodingFilter
          ??
          </ filter-class >
          ??
          < init-param >
          ???
          < param-name > encoding </ param-name >
          ???
          < param-value > GBK </ param-value >
          ??
          </ init-param >
          ??
          ?
          </ filter >


            所以我們在S端看到的是將以UTF-8編碼過的數(shù)據(jù)再以GBK解碼后所得到的數(shù)據(jù),這樣亂碼就出來了。所以解決也很簡單,交其重新以自己的方式編碼就OK了
            new String(str.getBytes("gbk"),"utf-8");

            同樣的道理,假如在C端碰到的是亂碼,那么在S端返回數(shù)據(jù)前將數(shù)據(jù)以UTF-8的格式傳輸
            src.getBytes("UTF-8")

            ajax.request中對事件的響應:
            首先我們得在請求初始化中加入響應狀態(tài)與自定義函數(shù):

          var ?my? = ? new ?Ajax.Request(
          ???url,?
          ???
          {
          ????method:?'get',
          ????parameters:?pars,
          ????asynchronous:?
          true ,
          ????onComplete:?showResponse
          ???}
          );


          它初始化了一個ajax事件的集合

          Ajax.Request.Events? =
          ??['Uninitialized',?'Loading',?'Loaded',?'Interactive',?'Complete'];


            這五個狀態(tài)正好對應五個readystate,ajax的五個readystate分別如下:
            0 (未初始化) 對象已建立,但是尚未初始化(尚未調(diào)用open方法)
            1 (初始化) 對象已建立,尚未調(diào)用send方法
            2 (發(fā)送數(shù)據(jù)) send方法已調(diào)用,但是當前的狀態(tài)及http頭未知
            3 (數(shù)據(jù)傳送中) 已接收部分數(shù)據(jù),因為響應及http頭不全,這時通過responseBody和responseText獲取部分數(shù)據(jù)會出現(xiàn)錯誤,
            4 (完成) 數(shù)據(jù)接收完畢,此時可以通過通過responseBody和responseText獲取完整的回應數(shù)據(jù)

          然后根據(jù)status(點這兒可以下載查看ajax參考資料,查看其所有屬性)來觸發(fā)指定事件,觸發(fā)代碼:

          onStateChange:? function ()? {
          ????
          var ?readyState? = ? this .transport.readyState;
          ????
          if ?(readyState? != ? 1 )
          ??????
          this .respondToReadyState( this .transport.readyState);
          ??}

          ?respondToReadyState:?
          function (readyState)? {
          ????
          var ?event? = ?Ajax.Request.Events[readyState];


          再次可以看到正好事件集合與readyState正好對應來調(diào)用,而通過以下來調(diào)用WEB自定義函數(shù)showResponse()

          try ? {
          ?????
          ??????(
          this .options['on'? + ?event]? || ?Prototype.emptyFunction)(transport,?json);
          ??????Ajax.Responders.dispatch('on'?
          + ?event,? this ,?transport,?json);
          ????}
          ? catch ?(e)? {
          ??????
          this .dispatchException(e);
          ????}


          ?未完,待續(xù)...

          posted on 2006-07-21 16:47 Jkallen 閱讀(33289) 評論(20)  編輯  收藏 所屬分類: AJAX 、其它開源

          評論

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-22 20:46 TiGERTiAN
          prototype有一定局限性,比如,我需要調(diào)用一個函數(shù)getArticleList()里面有很多參數(shù):新聞條數(shù),標題長度,是否打開新窗口等等,用這個框架的話,我不知道怎么把這些參數(shù)傳遞出去,因為他只有一個
          var my = new Ajax.Request(
          url,
          {
          method: 'get',
          parameters: pars,
          asynchronous: true ,
          onComplete: showResponse
          } );
          而showResponse的默認參數(shù)只有一個就是originalRequest,請問下水有好的辦法解決這個問題  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 08:31 藍天
          showResponse 中其實是有二個參數(shù)的,看源代碼就知道
          還有一個是跟json 頭有關

          而第一個剛是在ajax.request中得到的xmlhttp,你可以通過此參數(shù)得到到后臺傳來的text or xml格式的內(nèi)容,然后再處理就是了

          新聞條數(shù),標題長度,是否打開新窗口...這些東西你以自己的方式組織好,到了前臺再展開就可以了.  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 08:37 TiGERTiAN
          有個問題,例如我這個getArticleList函數(shù)在一個頁面又多次不同調(diào)用,那我肯定有多個不同xmlHttp對象,也就是說
          function getArticleList(x,y,z)
          {
          //先建立xmlHttp對象并請求數(shù)據(jù)
          //然后獲得了數(shù)據(jù)得到反應,我肯定需要把x,y,z傳給一個用來處理數(shù)據(jù)的getList,但是如果我用prototype的話,getList就只有那兩個參數(shù),我如何把我所需要的x,y,z一并傳給getList呢? 這就是我的疑問
          }  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 14:20 藍天
          getList 這個你是指后臺還是指在前臺呢?

          假如是指在后臺的的話那么你在用ajax.request的時候直接將三個數(shù)據(jù)放到prameter上(要是數(shù)據(jù)大可以考慮用post通過send來傳輸)來傳送到后臺.

          要是指前臺函數(shù)的話,應該就是JS函數(shù)了.那么你在后臺先封裝好x,y,z這三個數(shù)據(jù)(可以通過XML格式以及其它廣西格式),然后將它們放到流里,到前臺xmlHttp可以直接取了.

          你不可能(也沒必要)把showResponse ()里面加幫加三個參數(shù). 這些都在prottype中預先定義好的

          應該明白了吧?  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 14:30 TiGERTiAN
          我的意思你可能沒有看明白,我的意思是我需要用js控制1.新聞的顯示條數(shù),2.標題長度(同時在超鏈接的title屬性中要顯示全稱,所以就不可以用后臺直接生成好限制長度的新聞標題),還有我要控制的3.表格CSS,還有就是超鏈接是否彈出窗口等等很多參數(shù),我需要做成一個函數(shù),讓多個不同樣式不同需要的新聞欄目去調(diào)用這個函數(shù),那么就要傳遞不同的參數(shù)也就是說,在首頁里面我可能這樣調(diào)用
          最新新聞getArticleList(x1,y1,z1);
          熱點新聞getArticleList(x2,y2,z2);
          招聘信息getArticleList(x3,y3,z3);
          其它欄目以此類推
          getArticleList這個函數(shù)我主要用來創(chuàng)建xmlHttp并獲取數(shù)據(jù)存放在xmlHttp中,當onreadystatechange的時候我調(diào)用getList函數(shù)來處理xmlHttp,這樣有個問題就來了,我那些新聞條數(shù),標題長度等的參數(shù)也要一并傳入getList中,但prototype之可以有兩個參數(shù),那我其它參數(shù)如何傳遞如getList呢?需要注意不可以有全局變量,否則我怕會出現(xiàn)參數(shù)調(diào)用錯誤也就使x1可能還在用就被x2給替換了,不知道如何解決
            回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 14:50 藍天
          最新新聞getArticleList(x1,y1,z1);
          熱點新聞getArticleList(x2,y2,z2);
          招聘信息getArticleList(x3,y3,z3);

          這個里面的x*, y*, z* 都是從后臺取來的嗎?

          假如是:
          將它們封到xmlhttp中去,在JS中解析出來,再調(diào)用原來的代碼
          getArticleList(xmlhttp){
          x*= //throuth xmlhttp do sth
          y*= //throuth xmlhttp do sth
          z*= //throuth xmlhttp do sth
          //do origiral code ....
          };  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 14:55 TiGERTiAN
          x,y,z是getArticleList的參數(shù),使我在某個靜態(tài)頁面里面自己寫的,用來控制頁面顯示格式的,如新聞的條數(shù),標題長度,是否顯示時間等等,不是從后臺得到的。你再看一下我上一邊回帖。如何把這些參數(shù)也傳遞進showResponse呢?  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 17:10 藍天
          if so
          那你直接到 showResponse 里面執(zhí)行完xmlhttp的相關操作后再調(diào)用你想要的
          getArticleList好了啦  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 21:35 TiGERTiAN
          這個很難辦到,你怎樣在調(diào)用完showResponse之后才來控制輸出?那些參數(shù)怎么傳進去?  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 22:17 blue

          showResponse (){
          //with xmlhttp do something u want to do
          getArticleList(x1,y1,z1); //如果點的是最新新聞,里面就放最新新聞的相關參數(shù)。其它也一樣,也許我想的跟你不同,太簡單了
          }

          這兒都成BBS了哈...   回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-24 22:20 TiGERTiAN
          a simple question...Where are these x,y,z from???你怎么傳進來這些x,y,z?我說過不能用全局,否則可能會錯亂  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-07-31 14:17 看看
          ajax太好了  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-08-28 13:17 watson
          后臺怎么寫?。。。????

          我網(wǎng)點上搜到的全是前臺,難道后臺不用寫么 ???

          謝謝!?。。?nbsp; 回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-08-28 17:26 草好
          [item]GM之拳[/item]  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習(一) 2006-08-28 20:35 藍天
          后臺跟平時WEB頁面?zhèn)饕粯拥膶?nbsp; 回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習筆記(一) 2006-10-21 22:48 暗暗
          說清楚點好嗎?????????????  回復  更多評論
            

          # 藍天 你根本沒明白 TiGERTiAN 問的問題 2006-12-05 10:14
          請問 TiGERTiAN , 你遇到的問題解決了么?  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習筆記(一) 2007-05-10 15:38 Jidan
          prototype.js是公用的嗎?  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習筆記(一) 2008-03-05 16:17 zhxp
          傳參的問題搞定..
          Ajax.Request.prototype.tableName = this.tableName;
          var myAjax = new Ajax.Request(this.url,{method: 'get', parameters: this.parmeter, onSuccess:function(originalRequest){
          var data = new Data(eval(originalRequest.responseText),myAjax.tableName)
          data.render();
          }});  回復  更多評論
            

          # re: prototype.js之a(chǎn)jax.request學習筆記(一) 2009-06-01 22:25 aeon
          @TiGERTiAN

          function processRequest(url) {
          new Ajax.Request(
          url,
          {
          method: 'get',
          parameters: pars,
          asynchronous: true ,
          onComplete: showResponse
          }
          );
          }

          function showResponse(req) {
          alert(req.responseText);
          }
            回復  更多評論
            

          主站蜘蛛池模板: 金山区| 浦城县| 基隆市| 老河口市| 镇康县| 新蔡县| 刚察县| 双牌县| 白河县| 滦平县| 金山区| 太和县| 霞浦县| 邵阳市| 剑河县| 黄平县| 通许县| 洪湖市| 洞头县| 吉木萨尔县| 仁化县| 尚志市| 柏乡县| 永川市| 新乡市| 依兰县| 夹江县| 甘南县| 黄梅县| 方山县| 北流市| 万全县| 雅安市| 绥棱县| 淮阳县| 思南县| 读书| 义乌市| 吉首市| 绵竹市| 盐源县|