一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

Ajax一統天下之Dojo整合篇

隨著Ajax應用越來越多,各種Ajax Library(Prototype),Ajax Framework(DWR),Ajax Toolkit(Dojo,YUI)也日漸豐富起來,有沒有辦法將這些結合起來呢?類似Spring的做法,當然我沒法整出一個IoC的微內核將各種Ajax“粘合”起來,但是將這些Ajax可重用的組件加以整合應該是沒有問題的,這樣即可以避免重復發明輪子,還可以針對各種Ajax進行揚長避短,形成一套比較全面的Ajax解決方案。同時也增加了開發人員選擇自己熟悉Ajax組件的靈活性。 
目前我們公司已經形成一套基于Ajax的完整的產品,封裝了自己的Ajax前后臺通訊機制以及提供了可重用的客戶端組件,我嘗試了一下將我們的產品與Dojo Toolkit進行整合。下面是我的做法,整合的是Dojo ComboBox Widget,它實際上是一個Auto Completion組件,類似Google Suggest。 
從Dojo提供的測試類test_ComboBox.html入手,加debugger進行跟蹤調試,理清Dojo Widget的加載流程。 
經過跟蹤調試,對Dojo的Widget有了一個大致的了解:首先是加載當前需要的JavaScript文件,然后對整個html頁面進行解析。在頁面上使用widget有三種方式:一種就是在html元素上添加一些dojo能解析的屬性,如 
<select dojoType="combobox" style="width: 300px;" name="foo.bar1" autocomplete="false"  
        onValueChanged="setVal1"  
    >   
其中的dojoType,autocomplete, onValueChanged都是dojo能夠識別的屬性,這個有些類似typestry的做法。第二種就是使用DojoML的寫法: 
<dojo:combobox style="width: 300px;" name="foo.bar1" autocomplete="false"  
        onValueChanged="setVal1"  
    />   
這種寫法有些變態,跟jsp中的自定義標簽基本就是一回事,只是把解析的過程從后臺移到了前臺來做,后來看到有些框架也這么干,也就沒話說了。 
還有一種寫法是使用Javascript在頁面加載完成之后,在指定的html元素創建widget: 
var combo;   
dojo.addOnLoad(init);   
function init(){   
combo = dojo.widget.createWidget("dojo:ComboBox", {name:"prog",autocomplete:false,dataUrl:"comboBoxData.js"}, dojo.byId("progCombo"));   
    }   
在對元素解析創建的時候同時利用dojo定義的combobox html模版以及css模版完成在頁面中插入最終的combobox控件的目的。 
接下來看看Dojo ComboBox如何通過ajax與后臺通訊,Dojo ComboBox提供了兩種自動完成方式:一種是將所有的數據下載到前臺緩存,然后在前臺根據用戶輸入的數據從緩存中匹配出自動完成所需要的數據列表。另外一種就是根據用戶每次輸入的數據實時向后臺發送請求獲得要自動完成的數據,當然這個數據也會以用戶輸入的內容為key,以得到的數據為value進行緩存。對于兩種方式,Dojo通過不同的DataProvider來實現(dojo.widget.incrementalComboBoxDataProvider和dojo.widget.basicComboBoxDataProvider),這一點非常精妙,讓我非常佩服。而這兩個類都是通過dojo.declare(“className”, “parentClassName”, constructor, declarationBody)這種方式來做的,這個也和我們以往的做法有別。總之就是比較精妙啦! 
Dojo向后臺發送請求的過程封裝在dojo.io.bind()這個方法中,而我們有自己的一套前后臺通訊機制,因為必須想辦法將dojo.io.bind()替換成我們的做法來達到最終整合的目的,因為Dojo ComboBox的數據交互都是封裝在DataProvider里面的,因為我們只需要實現自己的DataProvider就可以搞定了,這樣我們無須修改Dojo的源,而且還可以使用Dojo的繼承機制,從已有的DataProvider集成復寫掉我需要替換的方法,這讓我有了寫Java的感覺。 
dojo.declare(   
    "dojo.widget.incrementalDoradoComboBoxDataProvider",   
    dojo.widget.incrementalComboBoxDataProvider,   
    null,   
    {   
        //要替換的方法,使用自己的通訊機制   
        startSearch: function(/*String*/ searchStr, /*Function*/ callback){   
            if(this._inFlight){   
                // FIXME: implement backoff!   
            }   
            var cmd = getControl(this.searchUrl);   
            cmd.parameters().setValue("searchString", searchStr);   
            var _this = this;   
            EventManager.addDoradoEvent(cmd, "onSuccess", function(command){   
                    _this._inFlight = false;   
                    //convention:   
                    //1.the key must be "result"   
                    //2.the data format must be [["Alabama","AL"],["Alaska","AK"]] or [{"Alabama":"AL"},{"Alaska":"AK"}]   
                    var data = dj_eval(command.outParameters().getValue("result"));   
                    if(!dojo.lang.isArray(data)){   
                        var arrData = [];   
                        for(var key in data){   
                            arrData.push([data[key], key]);   
                        }   
                        data = arrData;   
                    }   
                    _this._addToCache(searchStr, data);   
                    callback(data);   
                }   
            );   
            cmd.execute();   
            this._inFlight = true;   
        }   
    }   
);   
通過上面的處理,就可以使用我們自己的前后臺通訊機制來完成請求數據的目的。 
接下來就是生成我們的頁面,添加dojo加載js的腳本: 
<script type="text/Javascript" src="./dojo/dojo.js"></script>  
<script type="text/Javascript">  
    dojo.require("dojo.widget.ComboBox");   
    // 注意這里有一個定位的問題,查找路徑必須加"..",   
    // 因為dojo在查找DoradoComboBox.js的時候會從"/dojo"而不是"/"目錄開始查找   
    // 最終使用xmlhttp加載的路徑是/dojo/../adapter/dojo/widget/DoradoComboBox.js   
    dojo.setModulePrefix("adapter.dojo.widget","../adapter/dojo/widget");   
    dojo.require("adapter.dojo.widget.DoradoComboBox");   
</script>  
下面要加載的控件部分html: 
<input dojoType="ComboBox"    
                    dataUrl="cmdComboboxSearch"    
                    dataProviderClass = "dojo.widget.incrementalDoradoComboBoxDataProvider"    
                    style="width: 200px;"    
                    name="sample2"    
                    autocomplete="false"  
                    >   
這樣我們的整合工作就完成了,對了還有文件的目錄結構: 
Webapp 
|--adapter(存放所有用于整合的js文件) 
|------dojo 
|---------widget 
|-----------DoradoComboBox.js 
|--dojo(dojo的所有js文件) 
|------src 
|------dojo.js 
|--js(我們自己組件庫的js文件) 
|--WEB-INF
結論 
通過擴展之后還是發現了不少問題: 
1、由于集成的兩套東西都會在Object.prototype, Array.prototype, Function.prototype上加一些自己的東西,因此這樣非常容易帶來命名上的沖突,已經碰到這個問題。 
2、由于二者都會使用一些全局性的函數,變量等,這樣也會存在潛在的沖突,不過目前還沒有碰到。 
3、多套js庫要同時加載,客戶端的壓力是不是大了些?性能可以接受嗎?目前還沒有測試不得而知。

JavaScript技術Ajax一統天下之Dojo整合篇,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品国产福利片在线观看 | 88精品视频 | 在线看www免费看 | 我色网 | 亚洲精品日韩中文字幕久久久 | a男人的天堂久久a毛片 | 国产特黄一级一片免费 | 丁香婷婷综合五月综合色啪 | 不卡的毛片 | 视频一区 中文字幕 | 亚洲国产成人综合 | 天天色天天射综合网 | 91社区在线观看 | 国产精品自在线天天看片 | 伊人久久香 | 中文字幕无线码中文字幕免费 | 久99久热只有精品国产男同 | 国产无遮挡床戏视频免费 | 国产精品日韩欧美在线第3页 | 免费大学生国产在线观看p 免费的成人a视频在线观看 | 日本一区二区在线不卡 | 狠狠色噜噜狠狠狠四色米奇 | 高清不卡一区二区三区 | 一道精品视频一区二区三区图片 | 日本 ed2k| 涩涩在线视频 | 亚洲人成图片欧美人成图片 | 国产精品网站 夜色 | 亚洲图片另类图片 | 精品日韩二区三区精品视频 | 精品亚洲一区二区三区 | 热久久视久久精品18国产 | 91蝌蚪视频在线观看 | 亚洲欧洲色天使日韩精品 | 9l国产精品久久久久麻豆 | 日韩在线精品 | 男人私gay视频网站的 | 91精品欧美成人 | 色婷婷精品大全在线视频 | 视频在线亚洲 | 午夜黄色 |