( 五 ).Prototype ( 1.5 rc2) 使用指南之 array.js
$A = Array.from(iterable): 將 iterable 轉(zhuǎn)化為數(shù)組,如果 iterable 定義了 toArray 方法,就調(diào)用這個(gè)方法,否則利用 iterable 的 length 屬性進(jìn)行枚舉 , 如果 iterable 沒(méi)有 length 屬性的話就返回空數(shù)組 []
Array 對(duì)象除了擴(kuò)展 Enumerable 對(duì)象的方法外,另外擴(kuò)展了如下的幾個(gè)方法,
注意以下方法除了 clear 外都不改變?cè)瓉?lái)數(shù)組,而是返回一個(gè)新數(shù)組:
clear(): 清除數(shù)組,利用 arr.length=0
first(): 返回第一個(gè)元素
last() :返回最后一個(gè)元素
compact(): 去除數(shù)組中值為 null 或 undefined 的元素
flatten(): 將數(shù)組扁平化,例如 [3,4,[6,7]] 變?yōu)?/span> [3,4,6,7]
without(): 去除指定的元素 , 可以指定多個(gè)值 , 例如 [4,56,7,8].without(4,7) 返回 [56 , 8]
indexOf(object): 返回指定的元素在數(shù)組中的索引,不包含則返回 -1
reverse(inline) : Array 內(nèi)置函數(shù) reverse 的增強(qiáng),當(dāng) inline 為 true 時(shí),跟內(nèi)置的 reverse 函數(shù)效果一樣,改變?cè)瓟?shù)組的值,否則不改變?cè)瓉?lái)的值
reduce(): 如果數(shù)組只有一個(gè)元素,則返回這個(gè)元素,否則返回?cái)?shù)組本身
uniq(): 返回沒(méi)有重復(fù)元素的數(shù)組
clone(): 返回一個(gè)跟數(shù)組相同的數(shù)組, Array 中的 toArray 方法覆蓋了 Enumerable 中的 toArray 方法,指向了這個(gè)方法
inspect(): 跟數(shù)組的 toString 方法類(lèi)似,返回對(duì)象的字符串表示,例如 [2,3].inspect() 返回 "[2,3]"
( 六 ).Prototype ( 1.5 rc2) 使用指南之 hash.js
Hash 對(duì)象 ( 關(guān)聯(lián)數(shù)組 ) 是 Prototype 新建的一個(gè)對(duì)象,要?jiǎng)?chuàng)建一個(gè) Hash 對(duì)象可以調(diào)用 $H(object) 方法,使用這個(gè)方法將生成一個(gè)基于 object 對(duì)象的 Hash 對(duì)象,生成的 Hash 對(duì)象將 object 的屬性名作為 key ,將 object 的屬性值最為鍵值,因?yàn)?/span> javascript 本身的特點(diǎn) ( 對(duì)象本身就是關(guān)聯(lián)數(shù)組 ) ,所以實(shí)現(xiàn) Hash 也很簡(jiǎn)單, Prototype 中的 Hash 只是 javascript 的關(guān)聯(lián)數(shù)組 ( 對(duì)象 ) 而已
Prototype 中的 Hash 對(duì)象繼承自 Enumerable 對(duì)象,所以也具有 Enumerable 對(duì)象的所有屬性和方法,另外它具有以下的方法:
keys(): 返回 hash 的鍵值數(shù)組
values(): 返回值得數(shù)組
merge(hash): 合并兩個(gè) hash
toQueryString(): 跟 string 的 toQueryParams 方法想法,將 hash 轉(zhuǎn)化為一個(gè) querystring, 會(huì)調(diào)用 encodeURIComponent 對(duì)鍵和值進(jìn)行編碼
inspect(): hash 的字符串表示
因?yàn)?/span> hash 只是 javascript 的一個(gè)普通的對(duì)象而已,所以添加一個(gè)鍵值對(duì)使用: hash[key]=value 就可以了,刪除一個(gè)鍵值對(duì)使用 detele hash[key] 就可以了
( 七 ).Prototype ( 1.5 rc2) 使用指南之 range.js
Range 對(duì)象是一個(gè)繼承自 Enumerable 的 " 范圍 " 對(duì)象,你可以把它看成 [x,x+1,x+2,x+3 …… x+n] 的數(shù)組看待,但是比這樣的數(shù)組更節(jié)省存儲(chǔ)空間,因?yàn)?/span> range 對(duì)象只是保存 x 和 x+n 而已
要?jiǎng)?chuàng)建一個(gè) Range 對(duì)象調(diào)用 $R(start, end, exclusive) 函數(shù)就可以了, exclusive 指定是否包含 end 本身,如果沒(méi)有指定或?yàn)?/span> false 則包含 end ,否則不包含 , 你可以利用 Enumerable 中定義的方法來(lái)操作 range 對(duì)象, range 對(duì)象只是實(shí)現(xiàn)了 Enumerable 對(duì)象需要的枚舉邏輯 _each 和覆蓋了 include 方法而已
( 八 ).Prototype ( 1.5 rc2) 使用指南之 ajax
Prototype 中的 ajax.js 提供了一個(gè)非常好用的 ajax 框架,一般應(yīng)用中簡(jiǎn)單的調(diào)用以下代碼就可以了
new Ajax.Request(
??? url, {method: “get”,
??? onSuccess: showFilter,
??? onFailure: function(request){alert(”Server error!”)},
??? onException: showError}
? );
這個(gè)框架中提供了如下的對(duì)象和方法等:
Ajax 對(duì)象:
只有一個(gè) getTransport 方法,返回一個(gè) XMLHttpRequest 對(duì)象,另外有一個(gè) activeRequestCount 屬性,反映當(dāng)前正在處理的 ajax 數(shù)量
Ajax.Responders 對(duì)象:
繼承自 Enumerable ,管理全局 Ajax 的請(qǐng)求,具有如下方法
register(responder) :注冊(cè)一個(gè)管理 ajax 請(qǐng)求的對(duì)象
unregister(responder) :撤銷(xiāo)一個(gè)管理 ajax 請(qǐng)求的對(duì)象
dispatch(callback, request, transport, json) :觸發(fā)注冊(cè)的處理對(duì)象的方法
這個(gè)對(duì)象一般很少使用,系統(tǒng)中已經(jīng)使用如下的代碼注冊(cè)了一個(gè)處理對(duì)象
Ajax.Responders.register({
? onCreate: function() {
??? Ajax.activeRequestCount++;
? },
? onComplete: function() {
??? Ajax.activeRequestCount–;
? }
});
Ajax.Base 類(lèi):
Ajax 的基類(lèi) , 只有一個(gè)方法 setOptions(options), 默認(rèn) request 參數(shù)如下,你可以在新建 Ajax.request 時(shí)指定:
method:?????? 'post’,
asynchronous: true,
contentType:? 'application/x-www-form-urlencoded’,
encoding:???? ' UTF-8 ′ ,
Ajax.Request 類(lèi):
ajax 主要的類(lèi),繼承自 ajax.base 類(lèi),客戶(hù)端使用 new Ajax.Request(url,options) 調(diào)用, options 是一個(gè)對(duì)象 ( 關(guān)聯(lián)數(shù)組 ), 在 options 中可以指定 method , asynchronous , contentType , encoding , parameters , postBody , username,password 等選項(xiàng),其中 parameters 可以是字符傳或者關(guān)聯(lián)數(shù)組象,
另外在 options 中還可以通過(guò) requestHeaders 指定 request heads ,其中 requestHeaders 可以是數(shù)組 ( 例如 [ ” Connection ” , ” Close ” , ” aheadkey ” , ” aheadvalue ” ]) 或一個(gè)關(guān)聯(lián)數(shù)組;
options 中最重要的選項(xiàng)就是指定 ajax 的回調(diào)方法,可以定義 onComplete, onSuccess, onFailure, onException( 執(zhí)行過(guò)程中發(fā)生異常調(diào)用的方法,主要為 onComplete, onSuccess, onFailure 等回調(diào)方法產(chǎn)生的 ) ,甚至可以定義 on404,on503 這樣的回調(diào)方法,它們的參數(shù)為 (transport, json), 其中 transport 為請(qǐng)求的 XMLHttpRequest 對(duì)象 , json 是 evalJSON 的結(jié)果
如果返回的是一個(gè) javascript 文件 ( 根據(jù)返回的 Content-type 頭判斷 ) 將會(huì)執(zhí)行 evalResponse 方法,另外 Ajax.Request 對(duì)象還有一個(gè) evalJSON 方法,取得文件的時(shí)候就會(huì)執(zhí)行
這個(gè)對(duì)象的方法列表如下:
request(url) : 發(fā)送請(qǐng)求, new 的時(shí)候就已經(jīng)調(diào)用了,所以一般不需要使用
success(): 判斷 request 是否成功了
getHeader(name) :根據(jù) name 得到 request head
evalJSON(): 執(zhí)行 getHeader( ” X-JSON ” ), 并返回結(jié)果
evalResponse(): 執(zhí)行返回的 responseText 并返回
Ajax.Updater 類(lèi) :
繼承自 Ajax.Request ,只是比 Ajax.Request 增加了更新 html 元素的功能,一般使用方法是 new Ajax.Updater(element, url, options), element 可以是一個(gè)元素,也可以是 {success:e1,failure:e2} 這種形式 ,
默認(rèn)情況下不會(huì)執(zhí)行返回結(jié)果中的 javascript ,如果你先執(zhí)行,你可以指定 options 中的 evalScripts 為 true
默認(rèn)情況下是替換指定元素的內(nèi)容,如果你希望是添加,可以指定 options 的 insertion 參數(shù) , insertion 是一個(gè) Insertion.Before 、 Insertion.Top 或 Insertion.Bottom 、 Insertion.After( 將在 dom.js 中介紹 )
Ajax.PeriodicalUpdater 類(lèi) :
繼承自 Ajax.Base ,周期性的更新一個(gè) html 元素的內(nèi)容,這個(gè)類(lèi)會(huì)調(diào)用 Ajax.Updater 對(duì) html 元素進(jìn)行周期性的更新,使用方法為 new Ajax.PeriodicalUpdater(container, url, options), 參數(shù)跟 Ajax.Updater 差不多,其中 options 可以設(shè)置 frequency( 默認(rèn)為 2) , decay , decay 指的是當(dāng)請(qǐng)求的內(nèi)容沒(méi)有變化的時(shí)候, frequency 需要延長(zhǎng)的倍數(shù),默認(rèn)是 1 ,例如如果 decay 設(shè)為 2 , frequency 設(shè)為 3 而內(nèi)容一直沒(méi)有變化,則請(qǐng)求的時(shí)間依次會(huì)變?yōu)?/span> 3,6,12,24 等
start(): 開(kāi)始更新 , 初始化的時(shí)候會(huì)自動(dòng)調(diào)用
stop(): 停止更新