posts - 3, comments - 1, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2006年9月8日

          ?  在Ajax應用中,我們常常要頻繁更改某一元素的值。例如有一ID為"pageBody"的元素,我們想把所有文章內容都在這里顯示,做到局部刷新的Ajax應用。但如果因為網速較慢,使得此元素在接收信息時就被用戶執行其它行為,而改變此元素的內容了,而之前的接收信息的線程還在進行著,當此線程完成了,又把pageBody的值改了一下,此時用戶會覺得不知所措,怎么這塊東西閃來閃去的?嚴重者,會因為子元素的消失而出現JS錯誤的現象。
            為了解決此問題,有兩個方法:第一、在執行線程(假設執行一次取值為一個線程)的時候,建立一個滿屏的DIV,使得用戶無法執行其它行為;第二、制作一把鎖,把此元素鎖起來,當其它線程想改變它的值時先查檢此元素是否上鎖。
            第一種方法使得用戶進入了等待狀態,雖然頁面沒有刷新,但與沒有使用Ajax的頁面沒什么分別,所以在非不得已的情況下都不要使用此方法。
            下面我說說第二種方法--制作元素鎖。
            其實要實現這個鎖,原理很簡單,與java中的線程鎖有點類似,可惜偶對java的線程鎖理解不深入,所以在javaScript中此鎖與java的線程鎖應該又會有很大的不同,甚至完全不是一個回事。
            首先,我們需要一個Object,?

          var ?_key = {key:key,value: true };

          其中key為此對象的標識,value是否為真就等于是否為鎖定。
          在java中,每一個Object對象都可以用作鎖,但javaScript中不同,而且通過

          1??while(true){
          2???if(condition)?break;
          3??}

          的方法根本行不通,因為這個while(true)會讓瀏覽器僵死,Firefox會提示是否繼續執行腳本,IE可能會說腳本有誤,殺毒軟件可能說這是病毒!
            為了能統領全局,更靈活的掌控它,我們把鎖都放到一個數組中:

          1??var?_mainlock=[];

          同時,為了方便應用,我使用了Prototype.js,以擴展Array的方法,主要用這三個方法:
          1、detect(iterator):集合中每個元素調用一次Iterator,返回第一個使Iterator返回True的元素,如果最終都沒有為true的調用,那么返回null。
          ?2、reject(iterator):返回所有等于false的元素。
          ?3、each(iterator):把每個element做為第一個參數,element的index作為第一個參數調用iterator函數。
          ?有了它們,我們可以創建一個Push來給 _mainlock加入唯一key的鎖,類似HashMap原理:

          ? var ?_Push = function (Obj) {
          ??
          var ?unIns = _mainlock.reject( function (d) { return ?d.key == Obj.key;} );
          ??_mainlock
          = unIns;
          ??_mainlock.push(Obj);
          ?}


          只要執行_Push(_key)就可以把對象放入這個偽HashMap中去。如果已有相同的key的對象,則會覆蓋它,沒有就直接放入。

          var ?get = function (key) {
          ??
          return ?_mainlock.detect( function (d) { return ?d.key == key;} );
          ?}
          ;


          ?通過這個方法,就可以取得相應Key的鎖了。
          ?因為JavaScript對DOM的操作有著很多未知性,不可能總是通過我們預先定義的變量來滿足要求,如一個列表,可能是有一行,也可能上千行,每一行的ID又是獨立的,所以我們只能用另外的方法來預見之此行為,那就是通過應用HashMap的特性,以string為標識的唯一Key來統領所有將可能發生的事件。因此,再寫一個方法:

          ? var ?Lock = function (key) {
          ??
          var ?_key = {key:key,value: true } ;
          ??_Push(_key);
          ??
          return ? true ;
          ?}
          ;


          這樣,只要有一個string類型的key,就可以建立一個鎖對象了。以后,對鎖的建立和獲取,都可以通過上面三個方法來實現,只要一個string作為Key來操作鎖,而無需知道鎖的內部是如何構造。
          接下來,我們要實現isWait(),sleep(),awake()和awakeAll()方法,以完善這個鎖:

          ? var ?isWait = function (key) { // 返回真表示鎖,否則表示非鎖
          ?? var ?ins = GDnews.get(key);
          ??
          if (ins)? return ?ins.value;
          ??
          return ? false ;
          ?}
          ;
          ?
          var ?sleep = function (key,time) { // 給鎖上鎖指定秒數,若干秒后自動解鎖
          ??GDnews.Lock(key);
          ??window.setTimeout(
          function () {GDnews.awake(key)} ,time);
          ?}
          ;
          ?
          var ?awake = function (key) { // 強行開鎖
          ?? var ?_key = {key:key,value: false } ;
          ??GDnews._Push(_key);
          ??
          return ? false ;
          ?}
          ;
          ?
          var ?awakeAll = function () { // 強行打開所有鎖
          ?? if ( ! GDnews._mainlock)? return ? " all " ;
          ??
          var ?newList = [];
          ??GDnews._mainlock.each(
          function (d,index) {
          ???d.value
          = false ;
          ???newList.push(d);
          ??}
          );
          ??GDnews._mainlock
          = newList;
          ??
          return ? false ;
          ?}
          ;
          ?



          ?以后,當你使用Prototype.js的快捷鍵$()時,就可以看看目標是否為isWait,否的話就可以Lock或者sleep一下了。

          ?以上就是全文內容,請各位指點。

          ?

          posted @ 2006-09-14 18:26 govo 閱讀(369) | 評論 (0)編輯 收藏

          在javaworld上我問了一個問題:
          ??????當我們有了Ajax了,基本所有頁面都可能用Html為文件后綴了,TAG不用寫了,<%%>符號也不用寫了,那么,我們還用得著Struts或JSF嗎??
          ??????然后熱心的大蝦kebin_liu 給我指點了迷津,現在把他的話抄下:

          用一句俗語來解釋會比較容易瞭解,那就是『殺雞焉用牛刀』。
          Struts等 web framework算是牛刀,那AJAX就是殺雞小刀,殺雞小刀能不能取代牛刀?當然可以,只是用起來會不順手不方便而已。但反過來牛刀能不能取代小刀?答案是沒辦法完全取代,因為會有死角。

          web framework適合處理web ap的運作流程,而AJAX適合資料傳輸與頁面處理,如果從所有的web ap說穿了就只是資料傳輸與頁面處理的角度去思考,的確會認為AJAX可以替代一切 web framework。只是當一切都改用 AJAX來處理的時候,開發的工作勢必變得零碎繁瑣,就像用小刀殺牛,最終牛一定會死,但是操刀者辛苦不說,那頭牛也飽受凌遲。

          而因為 web framework無法處理純粹頁面部分的控制,所以不管有沒有AJAX,web ap都離不開 script,因為 web framework有這個死角,所以說webframework無法取代 AJAX。

          再用一個比喻,web framework就像是建築的主體,AJAX則是裝潢,一個結構穩固又適度裝潢的房子,才是最舒適的居住空間。只有裝潢的房子,其實就是樣品屋,雖然也可以住人,但是結構畢竟不穩。而過渡裝潢或沒有裝潢的房子,一樣讓人住起來不舒服。

          總之,web framework是架構面,AJAX則偏重於UI處理,二者的角色是相輔相成才對,並沒有互相衝突。不管有沒有AJAX,不用 framework本來就還是可以開發 web ap,但我們從來就不會因此說 framework是多餘的,有了AJAX也是一樣的。

          posted @ 2006-09-08 01:51 govo 閱讀(309) | 評論 (0)編輯 收藏

          今天鼓起勇氣向管理員申請BlogJava,希望能以此激勵自己,能在這最后一年的大學活里,更加努力!

          posted @ 2006-09-08 01:34 govo 閱讀(165) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 扶余县| 山东省| 定日县| 沙洋县| 宜黄县| 克山县| 惠来县| 集贤县| 大连市| 岚皋县| 中西区| 当涂县| 炎陵县| 道孚县| 大关县| 北碚区| 定陶县| 高唐县| 仙居县| 交口县| 长汀县| 台北县| 龙山县| 鄂州市| 崇明县| 宁河县| 陆河县| 新巴尔虎右旗| 五大连池市| 额尔古纳市| 古交市| 蒲城县| 阿拉善盟| 博客| 孟州市| 苍溪县| 水富县| 巴马| 巩义市| 栾城县| 云和县|