本站首页    管理页面    写新日志    退出


«December 2025»
123456
78910111213
14151617181920
21222324252627
28293031


公告

 工作中的Janet.加油!

    生活中的Janet.i-life


我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:
日志总数:30
评论数量:10
留言数量:0
访问次数:86318
建立时间:2005年8月31日




AJAX 上手篇
网上资源

janetvsfei 发表于 2005/10/9 13:52:59

AJAX 上手篇 From MoztwWiki 這篇文章說明 AJAX 相關技術的基礎,並提供實例供您上手。本文編譯自 AJAX:Getting Started (http://developer.mozilla.org/en/docs/AJAX:Getting_Started),在 devmo 有中文版之後可能會移過去。 內容大綱 [顯示隱藏] 1 AJAX 是啥? 2 第一步 – 說聲「請」 (又稱為「怎麼發出 XMLHttpRequest」) 3 第二步 – 「就上咩!」(又稱為「處理伺服器傳回的資料」) 4 第三步 - 萬事俱備 - 簡單範例 5 第四步 – 「X 檔案」(又稱為「處理 XML 回應值」) [編輯] AJAX 是啥? AJAX (Asynchronous JavaScript and XML, 非同步 JavaScript 及 XML 技術) 是個新詞,但內涵是兩個存在已有一段時間的 JavaScript 功能。這兩種功能以往一直被忽略,在 Gmail、Google suggest 及 Google Maps 出現後才一舉成名天下知。 這兩個 JavaScript 功能是: 在不重新讀取頁面的情況下對伺服器送出要求(request) 解析、使用 XML 文件 [編輯] 第一步 – 說聲「請」 (又稱為「怎麼發出 XMLHttpRequest」) 為了用 JavaScript 對伺服器發送 HTTP 要求,你必須先以相關的類別(class)製出實體(instance)。Internet Explorer 首先以 ActiveX 物件方式提供 XMLHTTP 類別,而 Mozilla、Safari 及其他瀏覽器則隨後以 XMLHttpRequest 類別支援此 ActiveX 物件中的類別及屬性。 因此,如果想跨瀏覽器,那麼可以這麼寫: if (window.XMLHttpRequest) { // Mozilla, Safari, ... http_request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE http_request = new ActiveXObject("Microsoft.XMLHTTP"); } (由於這段程式僅供說明,所以是採最簡方式寫出。本文第三步中有另一種我們比較常用的寫法。) 有些版本的 Mozilla 瀏覽器在伺服器送回的資料未含 XML mime-type 檔頭(header)時會出錯。為了避免這個問題,你可以用下列方法覆寫伺服器傳回的檔頭,以免傳回的不是 text/xml。 http_request = new XMLHttpRequest(); http_request.overrideMimeType('text/xml'); 接下來是要決定伺服器傳回資料後的處理方式,此時你只要以 onreadystatechange 這個屬性指明要處理傳回值的 JavaScript 函式名稱即可,例如: http_request.onreadystatechange = nameOfTheFunction; 注意,指定的函式名稱後不加括號也沒有參數。除了指定函式名稱外,你也能用 Javascript 即時定義函式的方法來定一個新的處理函式,如下: http_request.onreadystatechange = function(){ // 做些事 }; 決定處理方式之後你得確實發出 request,此時需叫用 HTTP request 類別的 open() 及 send() 方法,如下: http_request.open('GET', 'http://www.example.org/some.file', true); http_request.send(null); open() 的第一個參數是 HTTP request 的方法,也就是從 GET、POST、HEAD 中擇一使用,亦可用你主機上支援的方式。為遵循 HTTP 標準,請記得這些方法都是大寫,不然有的瀏覽器(如 Firefox)或許不會理你。其他 HTTP request 可以支援的方法列表請參考 W3C 規格書 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)。 第二個參數是目標 URL。基於安全考量,你不能叫用同網域以外的網頁。如果網域不同,則叫用 open() 時會出現「權限不足,拒絕存取」那類的錯誤。通常大夥會犯的錯誤多為在 domain.tld 網的網站下呼叫 www.domain.tld 中的網頁,僅是一點點差別都不行。 第三個參數決定此 request 是否不同步進行,如果設定為 TRUE 則即使伺服器尚未傳回資料也會繼續執行其餘的程式,這也就是 AJAX 中第一個 A 代表的意義。 send() 的參數在以 POST 發出 request 時可以是任何想傳給伺服器的東西,而資料則以查詢字串的方式列出,例如: name=value&anothername=othervalue&so=on [編輯] 第二步 – 「就上咩!」(又稱為「處理伺服器傳回的資料」) 傳出 request 時必須提供處理傳回值的函式名稱。 http_request.onreadystatechange = nameOfTheFunction; 那麼來看看這個函式該做些什麼。首先,它必須檢查 request 目前的狀態:如果狀態值為 4 代表伺服器已經傳回所有資訊了,便可以開始解析所得資訊。 if (http_request.readyState == 4) { // 一切 ok, 繼續解析 } else { // 還沒完成 } readyState 所有可能的值如下: 0 (還沒開始) 1 (讀取中) 2 (已讀取) 3 (資訊交換中) 4 (一切完成) (資料來源: MSDN (http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp)) 接下來要檢查伺服器傳回的 HTTP 狀態碼。所有狀態碼列表可於 W3C 網站 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)上查到,但我們要管的是 200 OK 這種狀態。 if (http_request.status == 200) { // 萬事具備 } else { // 似乎有點問題,或許伺服器傳回了 404 (查無此頁) 或者 500 (內部錯誤) 什麼的 } 檢查傳回的 HTTP 狀態碼後,要怎麼處理傳回的資料就由你決定了。有兩種存取資料的方式: http_request.responseText – 這樣會把傳回值當字串用 http_request.responseXML – 這樣會把傳回值視為 XMLDocument 物件,而後可用 JavaScript DOM 相關函式處理 [編輯] 第三步 - 萬事俱備 - 簡單範例 好,接著就做一次簡單的 HTTP 範例,演示方才的各項技巧。這段 JavaScript 會向伺服器要一份裡頭有「I'm a test.」字樣的 HTML 文件(test.html),而後以 alert() 將文件內容列出。 <script type="text/javascript" language="javascript"> var http_request = false; function makeRequest(url) { http_request = false; if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!http_request) { alert('Giving up :( Cannot create an XMLHTTP instance'); return false; } http_request.onreadystatechange = alertContents; http_request.open('GET', url, true); http_request.send(null); } function alertContents() { if (http_request.readyState == 4) { if (http_request.status == 200) { alert(http_request.responseText); } else { alert('There was a problem with the request.'); } } } </script> <span style="cursor: pointer; text-decoration: underline" onclick="makeRequest('test.html')"> Make a request </span> 在此範例中: 首先使用者按下「Make a request」 這麼一來就會呼叫 makeRequest() 函式,亦傳入參數值 test.html (也就是那份 HTML 檔的名稱,放在同目錄下) 接著發出 request,而後會將主導權交給 onreadystatechange 指定的 alertContents() 函式 alertContents() 檢查回應是否正常,而後以 alert() 將 test.html 的內容列出 你可以由此測試本例 (http://www.w3clubs.com/mozdev/httprequest_test.html),也可以參考測試檔案 (http://www.w3clubs.com/mozdev/test.html)。 [編輯] 第四步 – 「X 檔案」(又稱為「處理 XML 回應值」) 前面的例子中,在收到 HTTP 傳回值後我們以物件的 reponseText 屬性使用 test.html 檔案的內容,接著來試試 responseXML 屬性的方法。 首先,我們得做個格式正確的 XML 文件,以便稍後取用。此檔名喚 test.xml,內容如下: <?xml version="1.0" ?> <root> I'm a test. </root> 在程式中,我們叫用檔案的地方只須略事修改如下: ... onclick="makeRequest('test.xml')"> ... 接著在 alertContents() 中,我們必須將 alert(http_request.responseText); 改成這樣: var xmldoc = http_request.responseXML; var root_node = xmldoc.getElementsByTagName('root').item(0); alert(root_node.firstChild.data); 這樣一來我們便可取得 responseXML 所傳回的 XMLDocument 物件,而後以 DOM 相關的方法取用 XML 文件內容。你可以參考 test.xml 的原始碼 (http://www.w3clubs.com/mozdev/test.xml) 以及修改過後的測試程式 (http://www.w3clubs.com/mozdev/httprequest_test_xml.html)。 其他與 DOM 相關的方法,請參考 Mozilla DOM (http://www.mozilla.org/docs/dom/) 文件。


阅读全文(2814) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.453 second(s), page refreshed 144798486 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号