prototype 的ajax

原文:http://www.prototypejs.org/learn/introduction-to-ajax]
翻 譯:www.ruby-china.cn 站長]

Prototype框架提供了非常容易和有意思的方法處理Ajax的調用,同時它也是瀏 覽器安全的 。除了簡單的請求外,這個模塊(指prototype里的Ajax)也能很聰明的處理從服務器返回 的javascript代碼,并且提供了一個輔助的類不停的輪循。

Ajax的功能包含在了全局的Ajax對象里面。用于Ajax請求的 transport是xmlHttpRequest,它是從用戶角度的對不同瀏覽器進行安全的抽象的結果。真正的請求是通過創建Ajax. Request對象的實例實現的。復制內容到剪貼板代碼: new Ajax.Request('/some_url', { method:'get' });第一個參數是請求的地址,第二個是可選的哈希值。方法選項指定要使用的HTTP請求方法,默認是POST。

記住,由于安全的原 因(也就是防止跨站腳本攻擊)Ajax請求只能被用在與包含這個Ajax請求頁面相同的協議、主機與端口上。有些瀏覽器會允許任意的URL,但是你能不依 靠這個。

Ajax響應回調

Ajax請求默認是異步的,這也就意味著你必須要有回調函數能夠處理返回的數據。回調方法 在發起請求的時候傳給可選的哈希。復制內容到剪貼板代碼:

new Ajax.Request('/some_url',
{
method:'get',
onSuccess: function(transport){
var response = transport.responseText || "no response text";
alert("Success! \n\n" + response);
},
onFailure: function(){ alert('Something went wrong...') }
});
這里兩個回調函數傳給了這個哈希值,分別表示成功與失敗的警告。onSuccess和 onFailure根據返回的狀態相應的被調用。第一個參數是原生的xmlHttpRequest對象,可以分別使用它的responseText和 responseXML屬性。

你可以把兩個回調都定義,也可以是一個或者沒有,這全由你來定。其它的可以用的回調函數還有:
onUninitialized,
onLoading,
onLoaded,
onInteractive,
onComplete and
onException.


他們都與xmlHttpRequest的傳輸的某一個狀態有關系,除了在分發其它回調時出現異常后引起的onException外。

還 有可以得到的就是onXXX的回調。這里XXX是HTTP的返回狀態,象200或者404。需要注意的是,如果用這種方法,你的onSuccess和 onFailure就不會被調用了。因為onXXX有更高的優先級,因為這樣做的話,表示你知道你在做什么。

而 onUninitialized、onLoading、 onLoaded和onInteractive這些回調函數并沒有完全的被所有的瀏覽器實現出來。通過我們避免使用它們。

參數與 HTTP方法

你可以將請求參數象一個參數屬性一樣傳遞。復制內容到剪貼板代碼:
new Ajax.Request('/some_url', {
method: 'get',
parameters: {company: 'example', limit: 12}
});那么參數會以company=example&limit=12的形式發出。

你可以使用GET/POST中的任一種。但是需要注意的是GET的請求不應該導到致數據發生變化
。瀏覽器很少會緩存POST請求,但是它往往會緩存GET請求。

參數屬性的一個重要的應用是用Ajax請求發送一個FORM的內容,Prototype已經給了你一個
幫助的方法,叫做Form.serialize:復制內容到剪貼板代碼:
new Ajax.Request('/some_url', {
parameters: $('id_of_form_element').serialize(true)
});如果你需要發送自定義的HTTP請求頭,你可以用requestHeaders項來實現。只要作為
一個哈希或者用一個扁平的數組傳入名字—值對就可以了。如:['X-Custom-1', 'value',
'X-Custom-2', 'other value'].

如果由于某種原因,你必須POST一個自定義的POST體(沒有參數來自于參數項)的請求,有
一個postBody項就是為了這個目的設的。要注意的時,如果你使用postBody,那么你傳進來
的所有的參數都不會被發送,因為postBody有更高的優先級。這樣做的時候,你應該是清醒
的。

對javascript返回值求值

有時應用程序發送javascript代碼作為響應。如果這個返回的Contenty-Type與Javascript
的MIME的類型是一樣的,那么Prototype將會自動eval()返回的代碼。你如果沒有需要的話
,就不用顯式的處理這個響應。

還有可能就是這個響應是一個X-JSON的頭,那他的內容就會被解析,保存成立個對象并發送
給這些回調函數,當成第二個參數:復制內容到剪貼板代碼:
new Ajax.Request('/some_url', { method:'get',
onSuccess: function(transport, json){
alert(json ? Object.inspect(json) : "no JSON object");
}
});可以用這個函數來取比較重要的數據,以避免解析XML返回的損耗。JSON比XML要更快
(當然也更輕)。

全局響應者

這里有一個對象在每次Ajax請求時都會被調用:Ajax.Responders。你可以用他來注冊回調
函數在任何一個Ajax.Request狀態發生時被觸發:復制內容到剪貼板代碼:
Ajax.Responders.register({
onCreate: function(){
alert('a request has been initialized!');
},
onComplete: function(){
alert('a request completed');
}
});每個與xmlHttpRequest的傳輸狀態匹配的回調都可以放在這里,再帶上一個onCreate。
象這樣的全局的跟蹤請求在不少方面是很有用的:你可以把它們記錄下來以用于調試或者拋
出一個異常處理,來通過用戶可能的連接問題。

用Ajax.Updater來動態更新你的頁面
開發者經常想通過Ajax請求來接收HTML的片段來更新文檔的部分內容。通過Ajax.Request的
onComplete回調是相當容易的,但是如果是用Ajax.Update就會變得更加容易。
假設你的HTML文檔中有以下代碼:復制內容到剪貼板代碼:
<h2>Our fantastic products</h2>
<div id="products">(fetching product list ...)</div>'products'容器是空的,你
想把Ajax的響應的HTML返回值放到這里。沒有問題:復制內容到剪貼板代碼:
new Ajax.Updater('products', '/some_url', { method: 'get' });這就是全部,沒有別
的其它工作。變量與Ajax.Request是一樣的。除了第一個位置上多了一個接收元素。
Prototype會通過Element.update()來神奇的把響應更新到容器。

如果你的HTML里還有內含的一些腳本,默認情況下會被過濾掉,為了讓你的腳本被執行,你
必須在evalScripts選項上傳入真值。

那如果有錯誤發生,服務器返回一個錯誤信息而不是HTML,那會怎么樣?一般來講,你不會
想插入錯誤到用戶需要內容的地方。幸運的時,prototype提供了一個方法的解決辦法:你
現在在第一個參數里傳入以這種形式{ success:'products', failure:'errors' }表示兩個
不同的容器的哈希值,而不只是原來那一個。那么成功的話,內容就會被放在success的容
器上,錯誤就會被放在failure容器上。通過使用這些特性,你的界面就會變得更加用戶友
好。

你也可能不想覆蓋當前容器中的內容,而是想把新的HTML加在最前或者最后面。很好,你完
全可以這樣做。只要把要插入的對象當成是插入參數傳遞給Ajax就可以了:復制內容到剪貼
板代碼:
new Ajax.Updater('products', '/some_url', {
method: 'get',
insertion: Insertion.Top
});Ajax.Updater就會使用給定的對象在容器('products')元素里對返回的HTML執行插入
。漂亮的手法!


用Ajax.PeriodicalUpdater自動執行請求

你發現Ajax.Updater很酷,但是你還想定時的執行他從服務器取數據?Prototype框架也有
這個東西。這個東西就是Ajax.PeriodicalUpdater,它基本上就是定時的運行Ajax.
Updater。復制內容到剪貼板代碼:
new Ajax.PeriodicalUpdater('products', '/some_url',
{
method: 'get',
insertion: Insertion.Top,
frequency: 1,
decay: 2
});兩個新的參數是頻率與衰退。頻率就是請求產生的間隔,用秒表示。這里它是1秒,表
示Ajax每分鐘請求一次。默認的頻率是2秒。我們的用戶可能會對應用有這么好的響應程序
感到非常高興,但是我們的服務器可能性會承受非常大的壓力,如果用戶一直長時間開著瀏
覽器的話。這也是為什么有decay這個選項的原因。這是一個因子,通過它,頻率會在每次
得到相同的返回內容時被加倍。第一次可能是1秒,然后是2秒,然后是4秒,然后是8這樣一
直下去。當然,如果這個服務器一直返回不同的數據,decay就不會起作用。這個因子只在
你的內容基本上不變化了,返回的數據也基本相同時才起作用。

將頻率調低可以明顯減輕服務器的負擔,因為無用的請求次數會減少。你可以用這個因子在
監視服務器的負載,或者你可以傳進1來完全關掉它(1是默認值)或者省略掉。

轉載于:https://www.cnblogs.com/trance/archive/2010/03/28/1698929.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379296.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

匯編語言-018(FLD 、FST、FSTP、FCHS、FABS 、浮點運算符、浮點比較 )

1:FLD : FPU(浮點處理器)的加載浮點數到堆棧指令 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array REAL8 10 DUP(?) dblOne REAL8 234.56 dblTwo REAL8 10.1.code main PROCfld array …

mcq 隊列_MCQ | 基礎知識 免費和開源軟件| 套裝4

mcq 隊列Q1. What do you call the technique of storing encrypted user passwords in Linux? Q1。 您如何稱呼在Linux中存儲加密的用戶密碼的技術? System Password Management 系統密碼管理 Shadow Password 影子密碼 Encrypted Password 加密密碼 None of the…

將AX寄存器中的16位數據分成4組(從高到低),每組4位,然后把這4組數作為數當中的低4位分別放在AL,BL,CL,DL中。

將AX寄存器中的16位數據分成4組(從高到低),每組4位,然后把這4組數作為數當中的低4位分別放在AL,BL,CL,DL中。 P176 4.14 編程思路:首先用BX、DX存放AX,即原AX原BX原DX&…

一個很不錯的wp企業站模板

http://zjuhpp.com/chinese-localization-of-business-wordpress-theme-devster.html轉載于:https://www.cnblogs.com/i-kyle/archive/2012/09/13/2683817.html

著名的自由軟件圣戰- “KDE/QT .VS. Gnome/Gtk”

在 Unix 的圖形界面一向是以 MIT 的 X Window 系統為標準, 可是在商業應用上有兩大流派,一派是以 Sun 公司領導的 Openlook 陣營,一派是 IBM/HP 領導的OSF (Open Software Foundation) 的 Motif, 雙方經過多年競爭之后&#xff0c…

匯編語言-019(匯編程序與c\c++相互調用)

1:在C程序中使用__asm塊插入匯編代碼程序(不能用LENGTHOF與SIZEOF運算符,而是LENGTH和SIZE) struct Package {long originZip; //4long destinationzip;//4float shippingPrice; //4 };int main(int argcount,char* args[]) {c…

kotlin 判斷數字_Kotlin程序檢查數字是偶數還是奇數

kotlin 判斷數字Given a number N, we have to check whether it is EVEN or ODD. 給定數字N ,我們必須檢查它是偶數還是奇數 。 Example: 例: Input:N 13Output:"ODD"Input:N 24Output:"EVEN"程序在Kotlin檢查偶數或奇數 (Prog…

微機原理與接口技術(第2版)考點

第一章 1,微型計算機的特點: 功能強、可靠性高價格低廉系統設計靈活,適應性強體積小,重量輕,維護方便 2,微型計算機的硬件組成 微處理器內存儲器I/O接口電路I/O設備系統總線 3,微機的工作過…

搜狗面試筆試一面二面全經歷

09.25 華科西十二教,搜狗招聘筆試: C搜索引擎研發。同時有威盛、烽火兩家筆試,就沒有去。 09.26 華科校內某酒店,搜狗一面: 筆試做的不錯,客觀題錯了3.5(20個),后兩個算法…

UltraEdit語法高亮

語法加亮分支位于配置-編輯器顯示之下,允許用戶配置語法加亮選項:語法加亮可以識別預定詞語,并用不同顏色顯示它們。該功能對于程序員來說尤其有用,并且對那些想用不同顏色顯示文檔中詞語的用戶也非常有用。提供二十種…

線性代數 向量長度_用戶定義長度的向量| 使用Python的線性代數

線性代數 向量長度Prerequisite: Defining a vector 先決條件: 定義向量 Linear algebra is the branch of mathematics concerning linear equations by using vector spaces and through matrices. In other words, a vector is a matrix in n-dimensional space…

順序表(代碼、分析、匯編)

目錄:代碼:分析:匯編:代碼: SeqList.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; //定義鏈表數據類型,void因為要適用不同鏈表數據類型 typedef void SeqListNode; //定義鏈表節…

設有兩個16位整數變量A和B,試編寫完成下述操作的程序。

設有兩個16位整數變量A和B,試編寫完成下述操作的程序。 (1)若有兩個數中一個是奇數,則將奇數存入A中,偶數存入B中。 (2)若兩個數均為奇數,則兩數分別減1,并存回原變量中…

棋牌游戲服務器架構: 詳細設計(三) 數據庫設計

主要有3類Database: ServerInfoDB,UserInfoDB和GameDB。 ServerInfoDB主要存儲的是游戲列表的信息,UserInfoDB存儲玩家的全局信息,而GameDB就是積分以及積分變化情況。下面分別加以描述。 1. ServerInfoDB ServerInfoDB主要存儲游戲列表信息。主要有以下幾個表: 1. …

程序開發與性格特征

程序開發與性格特征 引言: 程序員給很多人的印象一般是不善于交際、表情嚴肅、思維緊密、做事認真、沉著冷靜等等。那么這些特征到底和程序開發有沒有關系呢?不同性格的人在團隊開發當中將面臨什么樣的問題以及不同性格的人在團隊開發中又將發揮著什么樣…

匯編語言編寫程序從1加到100要求使用循環結構。

匯編語言編寫程序從1加到100要求使用循環結構。 匯編思路:AX用于存放每次累加的結果—>09998…0 首先,DATA段中定義SUM用來存放結果和,STACK段定義一個200DB類型空間,用來存放數據。CODE段,AX清0,CX賦值…

c語言指針++_C ++此指針| 查找輸出程序| 套裝3

c語言指針Program 1: 程序1&#xff1a; #include <iostream>using namespace std;class Test {int VAL;public:Test(int v){VAL v;}Test* Sum(Test T1, Test T2){VAL T1.VAL T2.VAL;return this;}void print(){cout << VAL << " ";}};int mai…

線性表(代碼、分析、匯編)

目錄&#xff1a;代碼&#xff1a;分析&#xff1a;匯編&#xff1a;代碼&#xff1a; LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //定義線性表類型 typedef struct _tag_LinkListNode LinkListNode;//定義線性表節點類型 struct _tag_Li…

WPF 操作 richTextBox

FROM:http://blog.csdn.net/wuzhengqing1/article/details/7010902 取出richTextBox里面的內容 第一種方法&#xff1a; 將richTextBox的內容以字符串的形式取出 string xw System.Windows.Markup.XamlWriter.Save(richTextBox.Document); 第二種方法&#xff1a;將richTe…

微軟企業庫4.1學習筆記(八)創建對象 續集2

3.3通過配置指定和Unity的整合 另外一種方法是在配置源中指定配置的需要&#xff0c;你可以指定下面的一條或者多條&#xff1a; 你可以在Unity配置中指定想要的BlockExtensions  你可以在Unity配置中的type配置節指定如何創建企業庫對象&#xff0c;指定類型映射的關系&…