作者:江南白衣 ,@_@
  (本文為SpringSide參考手冊(cè)一部分,更多Java開源項(xiàng)目開發(fā)指南請(qǐng)?jiān)L問SpringSide參考手冊(cè))

   Prototype.js 是Javascript編寫者的一把小軍刀,提供了Ruby風(fēng)格的簡寫語法和實(shí)效的函數(shù),更難得的是完全跨瀏覽器,讓大家舒舒服服寫出又精簡又不用愁心兼容的的JS代碼,springside 已經(jīng)離不開它了。

 Prototype.js最重要的文檔有:

1.1 最愛$系列 

我最喜歡是可以用${"bookDiv"} 等價(jià)于通用的document.getElementByID("bookDiv")

值得留意的還有和CSS一樣的批量選擇語法$$(),如

$$(‘div#left_books).each(.)

Element系列有很多實(shí)用的函數(shù):  

$(‘bookdiv‘).update(‘ < p > </ p > ‘);  // 更新innerHtml 
$(‘bookdiv‘).show(); 
$(‘bookdiv‘).hide();
$(‘bookdiv‘).toggle();  
// 切換visiable
$(‘bookdiv‘).visiable();   // 返回是否visiable
$(‘bookdiv‘).scrollTo();

  .....還有很多 

1.2 傳統(tǒng)的Ajax

傳統(tǒng)的基于URL的ajax函數(shù)簡單實(shí)用。

   new  Ajax.Updater(‘bookdiv‘, "foo .jsp " );

此函數(shù)的還有很多可選的參數(shù),參數(shù)列表見此

 

new Ajax.Updater(‘bookdiv‘,"foo.jsp", {onComplete: initObserve});


比如需要異步執(zhí)行ajax, 更新bookdiv后需要重新執(zhí)行initObserve, onComplete的設(shè)置就剛好滿足你的要求。

另有可定時(shí)執(zhí)行Ajax的PeriodicalUpdater。

1.3 Form系列函數(shù)也不錯(cuò)

Form.serialize   將Form中所有Input對(duì)象的值轉(zhuǎn)化為一個(gè)URL String,方便把Form轉(zhuǎn)為用 URL Get方式的Ajax提交,最經(jīng)典的用Ajax提交Form的例子: 

  < form action = " /action/here "  method = " post "  
   onsubmi
= " new Ajax.Updater(‘div_to_be_updated‘, ‘/action/here‘, {parameters:Form.serialize(this)});
              return false;
" >  

  另外,Form.focusFirstElement , Form.getInputs等函數(shù)也很實(shí)用。 

1.4 Event系列

除了后述的Observe模式外,還有下列保證兼容IE和FF的事件函數(shù):

1.Event.element(event),找出觸發(fā)事件的element.

2.Event.findElement(event,tagName),搜索DOM tree里事件的響應(yīng)鏈里的第一個(gè)符合tagName的element.

3.pointerX(event),pointerY(event)等.

還定義了一些標(biāo)準(zhǔn)KeyCode,見:http://www./articles/prototype.js.html#Reference.Extensions.Event

1.5 Ruby風(fēng)格

1.循環(huán)函數(shù)

elements.each(  function (element){
        alert(element); 
       });

2.不定參數(shù)

new  Ajax.Updater(‘mydiv‘, ‘ / foo / bar‘, {asynchronous: true });

2. Observe模式達(dá)到搜索引擎Friendly

Observe模式,就是連接仍然以<a href="foo.jsp">形式編寫,用Observe為其加入onClick事件的偵聽。 這樣,當(dāng)搜索引擎訪問時(shí),就會(huì)訪問傳統(tǒng)的URL;而用戶使用IE訪問時(shí),就會(huì)被Observe轉(zhuǎn)為使用onClick事件的Ajax效果。

見SpringSide中的/home/index.jsp 圖書詳情察看--通過selector查找需要處理的鏈接(a),循環(huán)為每個(gè)鏈接添加觀察者,為click事件,添加handle函數(shù)。   
 

$$(‘div#left_books  *  a[href]‘).each( function (element){
Event.observe(element,‘click‘,handlerCilckEvent,
false );
});

function  handlerCilckEvent(event){
    
var  element  =  Event.element(event);
    
new  Ajax.Updater(‘bookdiv‘,element.href); 
    Event.stop(event);
    $(‘bookdiv‘).show();
}

3.script.的DomBuilder

script.語法超簡潔的Builder, 相比之下W3c的Dom Builder語法簡直是噩夢(mèng)。html片斷不復(fù)雜時(shí)如果用JSTemplate有點(diǎn)大炮打蚊子,用script.的Builder就夠了。
Builder很有Ruby的風(fēng)格,請(qǐng)看下面一句 : 

foo =  Builder.node(‘a(chǎn)‘, {href: " foo.jsp " },categorys[i].name)

第1個(gè)參數(shù)是element類型,第2個(gè)是可選的attribbute,第3個(gè)是節(jié)點(diǎn)內(nèi)的子節(jié)點(diǎn)。
如果要換成W3c的Dom函數(shù)寫法,善哉善哉。

下面這段更明顯,直接照元素的頁面順序來生成對(duì)象,而不是像W3C Dom Builder很邏輯抽象的,先生成對(duì)象,然后append到父元素。

div  =  Builder.node(‘div‘,{className:linkDiv},[ 
                       Builder.node(‘a(chǎn)‘, {href:
" foo.jsp " }, categorys[i].name)  ]
         );

 

當(dāng)然了,還是沒有JS Template清晰,所以Builder只作為html片斷非常短時(shí)使用。