<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA

    人生若只如初見(jiàn),何事秋風(fēng)悲畫扇。

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

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

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

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

    ??}

    }


      initialize相當(dāng)于構(gòu)造器,和java的構(gòu)造器一樣,可以自定義為帶參數(shù)性質(zhì)的。prototype中很多對(duì)象都是用它來(lái)創(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;
    ??}

    }


      它使得實(shí)現(xiàn)當(dāng)你想調(diào)用不同的方法直到其中的一個(gè)成功正常的這種需求變得非常容易, 他把一系列的方法作為參數(shù)并且按順序的一個(gè)一個(gè)的執(zhí)行這些方法直到其中的一個(gè)成功執(zhí)行,返回成功執(zhí)行的那個(gè)方法的返回值。
      ajax就是通過(guò)它得到一個(gè)可以跨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;
    }


      顧名思義,可正擴(kuò)展了一個(gè)對(duì)象屬性列表。這樣說(shuō)可能不太明白,結(jié)合Ajax再下就清楚了,如下,

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

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


      可以看到在prototype中用ajax的時(shí)候,它的options默認(rèn)有三個(gè),默認(rèn)值如上所示。這里可以通過(guò)以下方式來(lái)改變其默值(Ajax.Request的用法,呆會(huì)兒再看):

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

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

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


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

      在send時(shí)方法一定要用post才能生效,這個(gè)時(shí)候parameters就會(huì)失效了,源碼如下:

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


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

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


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

    < 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 >


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

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

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

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


    它初始化了一個(gè)ajax事件的集合

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


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

    然后根據(jù)status(點(diǎn)這兒可以下載查看ajax參考資料,查看其所有屬性)來(lái)觸發(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正好對(duì)應(yīng)來(lái)調(diào)用,而通過(guò)以下來(lái)調(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 閱讀(33277) 評(píng)論(20)  編輯  收藏 所屬分類: AJAX其它開(kāi)源

    評(píng)論

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

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

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

    新聞條數(shù),標(biāo)題長(zhǎng)度,是否打開(kāi)新窗口...這些東西你以自己的方式組織好,到了前臺(tái)再展開(kāi)就可以了.  回復(fù)  更多評(píng)論
      

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

    # re: prototype.js之a(chǎn)jax.request學(xué)習(xí)(一) 2006-07-24 14:20 藍(lán)天
    getList 這個(gè)你是指后臺(tái)還是指在前臺(tái)呢?

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

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

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

    應(yīng)該明白了吧?  回復(fù)  更多評(píng)論
      

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

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

    這個(gè)里面的x*, y*, z* 都是從后臺(tái)取來(lái)的嗎?

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

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

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

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

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

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

    這兒都成BBS了哈...   回復(fù)  更多評(píng)論
      

    # re: prototype.js之a(chǎn)jax.request學(xué)習(xí)(一) 2006-07-24 22:20 TiGERTiAN
    a simple question...Where are these x,y,z from???你怎么傳進(jìn)來(lái)這些x,y,z?我說(shuō)過(guò)不能用全局,否則可能會(huì)錯(cuò)亂  回復(fù)  更多評(píng)論
      

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

    # re: prototype.js之a(chǎn)jax.request學(xué)習(xí)(一) 2006-08-28 13:17 watson
    后臺(tái)怎么寫啊!!!???

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

    謝謝!!!!  回復(fù)  更多評(píng)論
      

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

    # re: prototype.js之a(chǎn)jax.request學(xué)習(xí)(一) 2006-08-28 20:35 藍(lán)天
    后臺(tái)跟平時(shí)WEB頁(yè)面?zhèn)饕粯拥膶?nbsp; 回復(fù)  更多評(píng)論
      

    # re: prototype.js之a(chǎn)jax.request學(xué)習(xí)筆記(一) 2006-10-21 22:48 暗暗
    說(shuō)清楚點(diǎn)好嗎?????????????  回復(fù)  更多評(píng)論
      

    # 藍(lán)天 你根本沒(méi)明白 TiGERTiAN 問(wèn)的問(wèn)題 2006-12-05 10:14
    請(qǐng)問(wèn) TiGERTiAN , 你遇到的問(wèn)題解決了么?  回復(fù)  更多評(píng)論
      

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

    # re: prototype.js之a(chǎn)jax.request學(xué)習(xí)筆記(一) 2008-03-05 16:17 zhxp
    傳參的問(wèn)題搞定..
    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();
    }});  回復(fù)  更多評(píng)論
      

    # re: prototype.js之a(chǎn)jax.request學(xué)習(xí)筆記(一) 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);
    }
      回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲人成网站18禁止一区| 精品亚洲视频在线| 1000部啪啪毛片免费看| 亚洲AV无码国产丝袜在线观看| 无码的免费不卡毛片视频| 国产免费牲交视频| 国产亚洲精品欧洲在线观看| 国产成人免费高清在线观看| 色欲aⅴ亚洲情无码AV蜜桃| 亚洲精品黄色视频在线观看免费资源| 日本免费高清一本视频| 亚洲AV无码精品国产成人| 在线观着免费观看国产黄| 自拍偷自拍亚洲精品播放| 国产a不卡片精品免费观看| 香港一级毛片免费看| 亚洲精品国产V片在线观看| 国产精品成人69XXX免费视频| 中文字幕亚洲激情| 野花香高清在线观看视频播放免费| 国产精品V亚洲精品V日韩精品| 中文字幕成人免费高清在线| 亚洲av一综合av一区| 99精品视频在线视频免费观看 | a一级毛片免费高清在线| 中文字幕亚洲专区| 国产羞羞的视频在线观看免费| 亚洲国产精久久久久久久| 黄床大片30分钟免费看| 亚洲性日韩精品一区二区三区| 国产做国产爱免费视频| 久久青青草原亚洲AV无码麻豆| 亚洲综合免费视频| 亚洲性无码一区二区三区| 国产精品国产免费无码专区不卡 | 国产又大又粗又硬又长免费| 一级午夜a毛片免费视频| 国产亚洲精品资源在线26u| 8888四色奇米在线观看免费看| 亚洲国产日韩精品| 亚洲AV无码一区二区三区在线观看|