舊文件

此處文件僅供參考,請自行考量時效性與適用程度,其他庫藏文件請參考文件頁面
我們亟需您的協助,進行共筆系統搬移、及文件整理工作,詳情請查閱參與我們

「AJAX 上手篇」修訂間的差異

出自 MozTW Wiki

行 1: 行 1:
 +
[http://cafevetc.freehost123.com/text-421.html health insurance nyc] [http://doaalja.isuisse.com/index.html index] [http://cyberquebec.ca/badanglican/475.html vancouver travel management company] [http://bracfar.0lx.net/lax-los-angeles.html cheap french train tickets] [http://lonrnex.ifrance.com/topic-473.html find horse jumping game] [http://awtrutaq.ibelgique.com/topic-107.html water ballon games] [http://droneltb.yourfreehosting.net/text-1.html cruise line royal caribbean] [http://qzefaxa.iquebec.com/news306.html cheap cruise deals] [http://lonrnex.ifrance.com/topic-99.html how to save money when you are high school] [http://paseretf.0lx.net/topic-343.html webmap] [http://catrocvio.0lx.net/comment-183.html army games online] [http://cxitoqet.iquebec.com/page-278.html hotel in london] [http://lonrnex.ifrance.com/topic-163.html poker free bankrolls] [http://doalqwua.mi-website.es/news-189.html beach bag] [http://monwliko.blackapplehost.com/topic453.html irish lottery results for monday] [http://mgetroo.mi-website.es/index.html index] [http://korofldr.isuisse.com/comment390.html site] [http://monwliko.blackapplehost.com/index.html http] [http://ckosapa.0lx.net/article369.html air travel flight reservation] [http://cyberquebec.ca/nomcdonn/topic-497.html luxury cruise vacation] [http://trvoqxaca.isuisse.com/topic-355.html fairmont hotel in vancouver] [http://ricinouet.blackapplehost.com/8.html ps3 80gb play ps2 games] [http://bookgirl.jos.ro/news356.html farm truck games] [http://lonrnex.ifrance.com/topic-67.html puppies for sale in las vegas] [http://dronkof.hostinginfive.com/page308.html executive inn suites] [http://qzefaxa.iquebec.com/news475.html rail travel france spain] [http://ricloen.strefa.pl/news-44.html cellular phone sprint] [http://samaxvou.iquebec.com/text183.html poker online tournament] [http://etplcnasa.0lx.net/403.html travel directions maps] [http://ckosapa.0lx.net/article320.html key west vacation home rentals] [http://ricloen.strefa.pl/news-339.html what are the current fha mortgage interest rates] [http://calicab.5webs.net/new493.html fun treasure hunt games for kids] [http://reyarplzw.strefa.pl/news-368.html games for girls 2 girls] [http://mgetroo.mi-website.es/article-57.html subaru part] [http://rolinlihe.5webs.net/news-276.html travel nurses] [http://cwlitre.0lx.net/the-love-meter.html game boy advance emulator] [http://plneltrof.mi-website.es/text-200.html movie ringtones] [http://cyberquebec.ca/wingoffon/text-410.html background screening] [http://cafevetc.freehost123.com/text-318.html chase hunter clip] [http://korofldr.isuisse.com/comment276.html social concerns about violent video games] [http://doalqwua.mi-website.es/news-9.html espresso machine rating] [http://wsedeasre.cnkk.org/new300.html las vegas hotel deal] [http://ondoacp.twbbs.org/new363.html cheep airline tickets] [http://maxpasse.cngogo.org/topic-22.html mount washington hotel] [http://xnrfevse.0lx.net/17.html luxury hotels key west florida] [http://bookgirl.jos.ro/news163.html gun games .com] [http://bookgirl.jos.ro/news247.html grand turismo 3 cheats] [http://reyarplzw.strefa.pl/news-103.html adult card games] [http://danikrv.h16.ru/news109.html the way of the master kirk cameron] 
 
[http://millennium-users.org/wiki/config/files/article673.html bikini bathing suit] [http://dayshotelwaterford.com/waterfordblog/wp-content/uploads/2008/article854.htm ask jeeves co] [http://fosterandallen.com/forum/avatars/icons/comment-1305.html yo moma jokes] [http://meetinmeath.com/images/ssm/icons/xqasoracg889.htm victoriasecret] [http://offalyhistory.com/authorpics/icons/topic-1755.htm johnny depp pirates pictures] [http://houseofireland.com/support/desk/images/article2312.html xxx free passwords] [http://customerminds.com/ie/assets/images/thumbs/article482.html planning a baby shower] [http://galwaybaygallery.com/hp_wordpress/wp-admin/css/styles/topic-2689.htm jeopardy video games] [http://galwaybaygallery.com/hp_wordpress/wp-admin/css/styles/topic-2039.htm white sand beach] [http://accomplished.ie/pp/uploads/media/page-873.html chilis restaurant] [http://millennium-users.org/wiki/config/files/article1106.html girl lover] [http://galwaybaygallery.com/hp_wordpress/wp-admin/css/styles/topic-652.htm mazda 3 body parts] [http://clondalkinrugby.com/images/icons/topic-1988.html martial arts instruction video] [http://clondalkinrugby.com/images/icons/topic-683.html pittsburgh pirates hat] [http://bombaypantry.com/archive/files/news-255-2009-11-06.html medical receptionist education] [http://accomplished.ie/pp/uploads/media/page-1519.html pregnant milf] [http://paqit.com/tts/upload/media/article1855.html malaria drug treatment] [http://artlinks.ie/course_comments/docs/article1203.html swimming strokes video] [http://advancedesign.ie/e-marketing/uploads/images/page1518.html eazy e music videos] [http://gaietyschool.com/app/webroot/files/temp/news-1176-2009-10-28.html diode laser modules] [http://ontargetwebdesign.net/j156/images/icons/text357.htm butchart gardens] [http://galwaybaygallery.com/hp_wordpress/wp-admin/css/styles/topic-302.htm pax movie] [http://meetinmeath.com/images/ssm/icons/calitr1679.htm jewel staite photo] [http://mullinahone.net/modlogan/images/icons/resource-333.html janice] [http://brianpeterspromotions.com/joomlax/images/new794.htm orange uk phone number] [http://houseofireland.com/support/desk/images/article1809.html paki] [http://meetinmeath.com/images/ssm/icons/index.htm url] [http://artlinks.ie/course_comments/docs/index.html sitemap] [http://johnquirke.com/old/awstats/pics/news-1233.html tommy tutone ringtone] [http://carlowweather.com/stat/log/files/index.html index] [http://artvaark-design.com/blog/bloguploads/2008/news-1822-20091109.html nutrisystem adipex] [http://clondalkinrugby.com/images/icons/topic-554.html reading music] [http://fosterandallen.com/forum/avatars/icons/comment-272.html girls humping furniture] [http://quirkeysolutions.com/wordpress/wp-content/uploads/2007/text-714.htm stabbin] [http://artvaark-design.com/blog/bloguploads/2008/sitemap.html webmap] [http://offalyhistory.com/authorpics/icons/topic-2464.htm cat hentai] [http://osgaeilge.com/phpbb2/store/files/henvarqas.htm nick stokes] [http://accomplished.ie/pp/uploads/media/page-452.html moexipril drug] [http://gaietyschool.com/app/webroot/files/temp/news-1761-2009-10-30.html adipex p pharmacy online] [http://artlinks.ie/course_comments/docs/article1835.html sepultura mp3] [http://fosterandallen.com/forum/avatars/icons/index.html webmap] [http://artlinks.ie/course_comments/docs/article2195.html zap and roger music] [http://shenick.com/clickheat/config/file/621.html map of us states and cities] [http://meetinmeath.com/images/ssm/icons/dronorsal213.htm vasoactive drugs] [http://johnquirke.com/old/awstats/pics/news-891.html american idol audition videos season 4] [http://bombaypantry.com/archive/files/news-868-2009-11-07.html vital signs 2006] [http://ontargetwebdesign.net/j156/images/icons/text951.htm rompl] [http://artvaark-design.com/blog/bloguploads/2008/news-1276-20091027.html edi healthclaims network licensee] [http://quirkeysolutions.com/wordpress/wp-content/uploads/2007/text-988.htm 26 34 34b] [http://advancedesign.ie/e-marketing/uploads/images/page322.html sexymodels]   
 
[http://millennium-users.org/wiki/config/files/article673.html bikini bathing suit] [http://dayshotelwaterford.com/waterfordblog/wp-content/uploads/2008/article854.htm ask jeeves co] [http://fosterandallen.com/forum/avatars/icons/comment-1305.html yo moma jokes] [http://meetinmeath.com/images/ssm/icons/xqasoracg889.htm victoriasecret] [http://offalyhistory.com/authorpics/icons/topic-1755.htm johnny depp pirates pictures] [http://houseofireland.com/support/desk/images/article2312.html xxx free passwords] [http://customerminds.com/ie/assets/images/thumbs/article482.html planning a baby shower] [http://galwaybaygallery.com/hp_wordpress/wp-admin/css/styles/topic-2689.htm jeopardy video games] [http://galwaybaygallery.com/hp_wordpress/wp-admin/css/styles/topic-2039.htm white sand beach] [http://accomplished.ie/pp/uploads/media/page-873.html chilis restaurant] [http://millennium-users.org/wiki/config/files/article1106.html girl lover] [http://galwaybaygallery.com/hp_wordpress/wp-admin/css/styles/topic-652.htm mazda 3 body parts] [http://clondalkinrugby.com/images/icons/topic-1988.html martial arts instruction video] [http://clondalkinrugby.com/images/icons/topic-683.html pittsburgh pirates hat] [http://bombaypantry.com/archive/files/news-255-2009-11-06.html medical receptionist education] [http://accomplished.ie/pp/uploads/media/page-1519.html pregnant milf] [http://paqit.com/tts/upload/media/article1855.html malaria drug treatment] [http://artlinks.ie/course_comments/docs/article1203.html swimming strokes video] [http://advancedesign.ie/e-marketing/uploads/images/page1518.html eazy e music videos] [http://gaietyschool.com/app/webroot/files/temp/news-1176-2009-10-28.html diode laser modules] [http://ontargetwebdesign.net/j156/images/icons/text357.htm butchart gardens] [http://galwaybaygallery.com/hp_wordpress/wp-admin/css/styles/topic-302.htm pax movie] [http://meetinmeath.com/images/ssm/icons/calitr1679.htm jewel staite photo] [http://mullinahone.net/modlogan/images/icons/resource-333.html janice] [http://brianpeterspromotions.com/joomlax/images/new794.htm orange uk phone number] [http://houseofireland.com/support/desk/images/article1809.html paki] [http://meetinmeath.com/images/ssm/icons/index.htm url] [http://artlinks.ie/course_comments/docs/index.html sitemap] [http://johnquirke.com/old/awstats/pics/news-1233.html tommy tutone ringtone] [http://carlowweather.com/stat/log/files/index.html index] [http://artvaark-design.com/blog/bloguploads/2008/news-1822-20091109.html nutrisystem adipex] [http://clondalkinrugby.com/images/icons/topic-554.html reading music] [http://fosterandallen.com/forum/avatars/icons/comment-272.html girls humping furniture] [http://quirkeysolutions.com/wordpress/wp-content/uploads/2007/text-714.htm stabbin] [http://artvaark-design.com/blog/bloguploads/2008/sitemap.html webmap] [http://offalyhistory.com/authorpics/icons/topic-2464.htm cat hentai] [http://osgaeilge.com/phpbb2/store/files/henvarqas.htm nick stokes] [http://accomplished.ie/pp/uploads/media/page-452.html moexipril drug] [http://gaietyschool.com/app/webroot/files/temp/news-1761-2009-10-30.html adipex p pharmacy online] [http://artlinks.ie/course_comments/docs/article1835.html sepultura mp3] [http://fosterandallen.com/forum/avatars/icons/index.html webmap] [http://artlinks.ie/course_comments/docs/article2195.html zap and roger music] [http://shenick.com/clickheat/config/file/621.html map of us states and cities] [http://meetinmeath.com/images/ssm/icons/dronorsal213.htm vasoactive drugs] [http://johnquirke.com/old/awstats/pics/news-891.html american idol audition videos season 4] [http://bombaypantry.com/archive/files/news-868-2009-11-07.html vital signs 2006] [http://ontargetwebdesign.net/j156/images/icons/text951.htm rompl] [http://artvaark-design.com/blog/bloguploads/2008/news-1276-20091027.html edi healthclaims network licensee] [http://quirkeysolutions.com/wordpress/wp-content/uploads/2007/text-988.htm 26 34 34b] [http://advancedesign.ie/e-marketing/uploads/images/page322.html sexymodels]   
{{MDC|AJAX:上手篇}}
+
{{MDC|AJAX:上手篇}}
這篇文章說明 AJAX 相關技術的基礎,並提供實例供您上手。
+
這篇文章說明 AJAX 相關技術的基礎,並提供實例供您上手。
  
  
== 第一步 – 說聲「請」 (又稱為「'''怎麼發出 XMLHttpRequest'''」) ==
+
== 第一步 – 說聲「請」 (又稱為「'''怎麼發出 XMLHttpRequest'''」) ==
  
為了用 JavaScript 對伺服器發送 HTTP 要求,必須先以相關的類別(class)製出實體(instance)。Internet Explorer 首先以 ActiveX 物件方式提供 <code>XMLHTTP</code> 類別,而 Mozilla、Safari 及其他瀏覽器則隨後以 <code>XMLHttpRequest</code> 類別支援此 ActiveX 物件中的類別及屬性。
+
為了用 JavaScript 對伺服器發送 HTTP 要求,必須先以相關的類別(class)製出實體(instance)。Internet Explorer 首先以 ActiveX 物件方式提供 <code>XMLHTTP</code> 類別,而 Mozilla、Safari 及其他瀏覽器則隨後以 <code>XMLHttpRequest</code> 類別支援此 ActiveX 物件中的類別及屬性。
  
因此,如果想跨瀏覽器,那麼可以這麼寫:
+
因此,如果想跨瀏覽器,那麼可以這麼寫:
  
 
<pre>
 
<pre>
行 18: 行 19:
 
</pre>
 
</pre>
  
(由於這段程式僅供說明,所以是採最簡方式寫出。本文第三步中有另一種我們比較常用的寫法。)
+
(由於這段程式僅供說明,所以是採最簡方式寫出。本文第三步中有另一種我們比較常用的寫法。)
  
有些版本的 Mozilla 瀏覽器在伺服器送回的資料未含 XML mime-type 檔頭(header)時會出錯。為了避免這個問題,你可以用下列方法覆寫伺服器傳回的檔頭,以免傳回的不是 <code>text/xml</code>。
+
有些版本的 Mozilla 瀏覽器在伺服器送回的資料未含 XML mime-type 檔頭(header)時會出錯。為了避免這個問題,你可以用下列方法覆寫伺服器傳回的檔頭,以免傳回的不是 <code>text/xml</code>。
  
 
<pre>
 
<pre>
行 27: 行 28:
 
</pre>
 
</pre>
  
接下來是要決定伺服器傳回資料後的處理方式,此時你只要以 <code>onreadystatechange</code> 這個屬性指明要處理傳回值的 JavaScript 函式名稱即可,例如:
+
接下來是要決定伺服器傳回資料後的處理方式,此時你只要以 <code>onreadystatechange</code> 這個屬性指明要處理傳回值的 JavaScript 函式名稱即可,例如:
  
 
<code>http_request.onreadystatechange = nameOfTheFunction;</code>
 
<code>http_request.onreadystatechange = nameOfTheFunction;</code>
  
注意,指定的函式名稱後不加括號也沒有參數。除了指定函式名稱外,你也能用 Javascript 即時定義函式的方法來定一個新的處理函式,如下:
+
注意,指定的函式名稱後不加括號也沒有參數。除了指定函式名稱外,你也能用 Javascript 即時定義函式的方法來定一個新的處理函式,如下:
  
 
<pre>
 
<pre>
 
http_request.onreadystatechange = function(){
 
http_request.onreadystatechange = function(){
     // 做些事
+
     // 做些事
 
};
 
};
 
</pre>
 
</pre>
  
決定處理方式之後你得確實發出 request,此時需叫用 HTTP request 類別的 <code>open()</code> 及 <code>send()</code> 方法,如下:
+
決定處理方式之後你得確實發出 request,此時需叫用 HTTP request 類別的 <code>open()</code> 及 <code>send()</code> 方法,如下:
  
 
<pre>
 
<pre>
行 46: 行 47:
 
</pre>
 
</pre>
  
* <code>open()</code> 的第一個參數是 HTTP request 的方法,也就是從 GET、POST、HEAD 中擇一使用,亦可用你主機上支援的方式。為遵循 HTTP 標準,請記得這些方法都是大寫,不然有的瀏覽器(如 Firefox)或許不會理你。其他 HTTP request 可以支援的方法列表請參考 [http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C 規格書]。
+
* <code>open()</code> 的第一個參數是 HTTP request 的方法,也就是從 GET、POST、HEAD 中擇一使用,亦可用你主機上支援的方式。為遵循 HTTP 標準,請記得這些方法都是大寫,不然有的瀏覽器(如 Firefox)或許不會理你。其他 HTTP request 可以支援的方法列表請參考 [http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C 規格書]。
* 第二個參數是目標 URL。基於安全考量,你不能叫用同網域以外的網頁。如果網域不同,則叫用 <code>open()</code> 時會出現「權限不足,拒絕存取」那類的錯誤。通常大夥會犯的錯誤多為在 domain.tld 網的網站下呼叫 www.domain.tld 中的網頁,僅是一點點差別都不行。
+
* 第二個參數是目標 URL。基於安全考量,你不能叫用同網域以外的網頁。如果網域不同,則叫用 <code>open()</code> 時會出現「權限不足,拒絕存取」那類的錯誤。通常大夥會犯的錯誤多為在 domain.tld 網的網站下呼叫 www.domain.tld 中的網頁,僅是一點點差別都不行。
* 第三個參數決定此 request 是否不同步進行,如果設定為 <code>TRUE</code> 則即使伺服器尚未傳回資料也會繼續執行其餘的程式,這也就是 AJAX 中第一個 A 代表的意義。
+
* 第三個參數決定此 request 是否不同步進行,如果設定為 <code>TRUE</code> 則即使伺服器尚未傳回資料也會繼續執行其餘的程式,這也就是 AJAX 中第一個 A 代表的意義。
  
<code>send()</code> 的參數在以 POST 發出 request 時可以是任何想傳給伺服器的東西,而資料則以查詢字串的方式列出,例如:
+
<code>send()</code> 的參數在以 POST 發出 request 時可以是任何想傳給伺服器的東西,而資料則以查詢字串的方式列出,例如:
  
 
<code>name=value&anothername=othervalue&so=on</code>
 
<code>name=value&anothername=othervalue&so=on</code>
  
不過如果你想要以 POST 方式傳送資料,則必須先將 MIME 型態改好,如下:
+
不過如果你想要以 POST 方式傳送資料,則必須先將 MIME 型態改好,如下:
 
<pre>
 
<pre>
 
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 
</pre>
 
</pre>
否則伺服器就不會理你傳過來的資料了。
+
否則伺服器就不會理你傳過來的資料了。
  
== 第二步 – 「就上咩!」(又稱為「處理伺服器傳回的資料」) ==
+
== 第二步 – 「就上咩!」(又稱為「處理伺服器傳回的資料」) ==
  
傳出 request 時必須提供處理傳回值的函式名稱。
+
傳出 request 時必須提供處理傳回值的函式名稱。
  
 
<code>http_request.onreadystatechange = nameOfTheFunction;</code>
 
<code>http_request.onreadystatechange = nameOfTheFunction;</code>
  
那麼來看看這個函式該做些什麼。首先,它必須檢查 request 目前的狀態:如果狀態值為 4 代表伺服器已經傳回所有資訊了,便可以開始解析所得資訊。
+
那麼來看看這個函式該做些什麼。首先,它必須檢查 request 目前的狀態:如果狀態值為 4 代表伺服器已經傳回所有資訊了,便可以開始解析所得資訊。
 
      
 
      
 
<pre>
 
<pre>
 
if (http_request.readyState == 4) {
 
if (http_request.readyState == 4) {
     // 一切 ok, 繼續解析
+
     // 一切 ok, 繼續解析
 
} else {
 
} else {
     // 還沒完成
+
     // 還沒完成
 
}
 
}
 
</pre>
 
</pre>
  
<code>readyState</code> 所有可能的值如下:
+
<code>readyState</code> 所有可能的值如下:
* 0 (還沒開始)
+
* 0 (還沒開始)
* 1 (讀取中)
+
* 1 (讀取中)
* 2 (已讀取)
+
* 2 (已讀取)
* 3 (資訊交換中)
+
* 3 (資訊交換中)
* 4 (一切完成)
+
* 4 (一切完成)
([http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp 資料來源: MSDN])
+
([http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp 資料來源: MSDN])
  
接下來要檢查伺服器傳回的 HTTP 狀態碼。所有狀態碼列表可於 [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html W3C 網站]上查到,但我們要管的是 <code>200 OK</code> 這種狀態。
+
接下來要檢查伺服器傳回的 HTTP 狀態碼。所有狀態碼列表可於 [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html W3C 網站]上查到,但我們要管的是 <code>200 OK</code> 這種狀態。
  
 
<pre>
 
<pre>
 
if (http_request.status == 200) {
 
if (http_request.status == 200) {
     // 萬事具備
+
     // 萬事具備
 
} else {
 
} else {
     // 似乎有點問題,或許伺服器傳回了 404 (查無此頁) 或者 500 (內部錯誤) 什麼的
+
     // 似乎有點問題,或許伺服器傳回了 404 (查無此頁) 或者 500 (內部錯誤) 什麼的
 
}
 
}
 
</pre>
 
</pre>
  
檢查傳回的 HTTP 狀態碼後,要怎麼處理傳回的資料就由你決定了。有兩種存取資料的方式:
+
檢查傳回的 HTTP 狀態碼後,要怎麼處理傳回的資料就由你決定了。有兩種存取資料的方式:
* <code>http_request.responseText</code> – 這樣會把傳回值當字串用
+
* <code>http_request.responseText</code> – 這樣會把傳回值當字串用
* <code>http_request.responseXML</code> – 這樣會把傳回值視為 <code>XMLDocument</code> 物件,而後可用 JavaScript DOM 相關函式處理
+
* <code>http_request.responseXML</code> – 這樣會把傳回值視為 <code>XMLDocument</code> 物件,而後可用 JavaScript DOM 相關函式處理
  
== 第三步 - 萬事俱備 - 簡單範例 ==
+
== 第三步 - 萬事俱備 - 簡單範例 ==
  
好,接著就做一次簡單的 HTTP 範例,演示方才的各項技巧。這段 JavaScript 會向伺服器要一份裡頭有「I'm a test.」字樣的 HTML 文件(<code>test.html</code>),而後以 <code>alert()</code> 將文件內容列出。
+
好,接著就做一次簡單的 HTTP 範例,演示方才的各項技巧。這段 JavaScript 會向伺服器要一份裡頭有「I'm a test.」字樣的 HTML 文件(<code>test.html</code>),而後以 <code>alert()</code> 將文件內容列出。
  
 
<pre>
 
<pre>
行 155: 行 156:
 
</pre>
 
</pre>
  
在此範例中:
+
在此範例中:
* 首先使用者按下「Make a request」
+
* 首先使用者按下「Make a request」
* 這麼一來就會呼叫 <code>makeRequest()</code> 函式,亦傳入參數值 <code>test.html</code> (也就是那份 HTML 檔的名稱,放在同目錄下)
+
* 這麼一來就會呼叫 <code>makeRequest()</code> 函式,亦傳入參數值 <code>test.html</code> (也就是那份 HTML 檔的名稱,放在同目錄下)
* 接著發出 request,而後會將主導權交給 <code>onreadystatechange</code> 指定的 <code>alertContents()</code> 函式
+
* 接著發出 request,而後會將主導權交給 <code>onreadystatechange</code> 指定的 <code>alertContents()</code> 函式
* <code>alertContents()</code> 檢查回應是否正常,而後以 <code>alert()</code> 將 <code>test.html</code> 的內容列出
+
* <code>alertContents()</code> 檢查回應是否正常,而後以 <code>alert()</code> 將 <code>test.html</code> 的內容列出
  
你可以[http://www.w3clubs.com/mozdev/httprequest_test.html 由此測試本例],也可以參考[http://www.w3clubs.com/mozdev/test.html 測試檔案]。
+
你可以[http://www.w3clubs.com/mozdev/httprequest_test.html 由此測試本例],也可以參考[http://www.w3clubs.com/mozdev/test.html 測試檔案]。
  
== 第四步 – 「X 檔案」(又稱為「處理 XML 回應值」) ==
+
== 第四步 – 「X 檔案」(又稱為「處理 XML 回應值」) ==
  
前面的例子中,在收到 HTTP 傳回值後我們以物件的 <code>reponseText</code> 屬性使用 <code>test.html</code> 檔案的內容,接著來試試 <code>responseXML</code> 屬性的方法。
+
前面的例子中,在收到 HTTP 傳回值後我們以物件的 <code>reponseText</code> 屬性使用 <code>test.html</code> 檔案的內容,接著來試試 <code>responseXML</code> 屬性的方法。
  
首先,我們得做個格式正確的 XML 文件,以便稍後取用。此檔名喚 <code>test.xml</code>,內容如下:
+
首先,我們得做個格式正確的 XML 文件,以便稍後取用。此檔名喚 <code>test.xml</code>,內容如下:
  
 
<pre>
 
<pre>
行 176: 行 177:
 
</pre>
 
</pre>
  
在程式中,我們叫用檔案的地方只須略事修改如下:
+
在程式中,我們叫用檔案的地方只須略事修改如下:
  
 
<pre>
 
<pre>
行 184: 行 185:
 
</pre>
 
</pre>
  
接著在 <code>alertContents()</code> 中,我們必須將 <code>alert(http_request.responseText);</code> 改成這樣:
+
接著在 <code>alertContents()</code> 中,我們必須將 <code>alert(http_request.responseText);</code> 改成這樣:
  
 
<pre>
 
<pre>
行 192: 行 193:
 
</pre>
 
</pre>
  
這樣一來我們便可取得 <code>responseXML</code> 所傳回的 <code>XMLDocument</code> 物件,而後以 DOM 相關的方法取用 XML 文件內容。你可以參考 [http://www.w3clubs.com/mozdev/test.xml<code>test.xml</code> 的原始碼] 以及修改過後的[http://www.w3clubs.com/mozdev/httprequest_test_xml.html 測試程式]。
+
這樣一來我們便可取得 <code>responseXML</code> 所傳回的 <code>XMLDocument</code> 物件,而後以 DOM 相關的方法取用 XML 文件內容。你可以參考 [http://www.w3clubs.com/mozdev/test.xml<code>test.xml</code> 的原始碼] 以及修改過後的[http://www.w3clubs.com/mozdev/httprequest_test_xml.html 測試程式]。
  
其他與 DOM 相關的方法,請參考 [http://www.mozilla.org/docs/dom/ Mozilla DOM] 文件。
+
其他與 DOM 相關的方法,請參考 [http://www.mozilla.org/docs/dom/ Mozilla DOM] 文件。
  
 
<div style="display:none;">
 
<div style="display:none;">
[[{{literal2|=Category:文件專案|文件專案=}}|{{literal2|={{PAGENAME}}|文件專案=}}]]
+
[[{{literal2|=Category:文件專案|文件專案=}}|{{literal2|={{PAGENAME}}|文件專案=}}]]
 
[[{{literal2|=Category:{{{4}}}|{{{4}}}=}}|{{literal2|={{PAGENAME}}|{{{4}}}=}}]]
 
[[{{literal2|=Category:{{{4}}}|{{{4}}}=}}|{{literal2|={{PAGENAME}}|{{{4}}}=}}]]
 
[[{{literal2|=Category:{{{5}}}|{{{5}}}=}}|{{literal2|={{PAGENAME}}|{{{5}}}=}}]]
 
[[{{literal2|=Category:{{{5}}}|{{{5}}}=}}|{{literal2|={{PAGENAME}}|{{{5}}}=}}]]
行 203: 行 204:
 
</div>
 
</div>
  
<div class="page-nav"><b>‧返回上一頁: </b>[[開發人員文件主頁]]</div>
+
<div class="page-nav"><b>‧返回上一頁: </b>[[開發人員文件主頁]]</div>

於 2009年11月21日 (六) 15:45 的修訂

health insurance nyc index vancouver travel management company cheap french train tickets find horse jumping game water ballon games cruise line royal caribbean cheap cruise deals how to save money when you are high school webmap army games online hotel in london poker free bankrolls beach bag irish lottery results for monday index site http air travel flight reservation luxury cruise vacation fairmont hotel in vancouver ps3 80gb play ps2 games farm truck games puppies for sale in las vegas executive inn suites rail travel france spain cellular phone sprint poker online tournament travel directions maps key west vacation home rentals what are the current fha mortgage interest rates fun treasure hunt games for kids games for girls 2 girls subaru part travel nurses game boy advance emulator movie ringtones background screening chase hunter clip social concerns about violent video games espresso machine rating las vegas hotel deal cheep airline tickets mount washington hotel luxury hotels key west florida gun games .com grand turismo 3 cheats adult card games the way of the master kirk cameron bikini bathing suit ask jeeves co yo moma jokes victoriasecret johnny depp pirates pictures xxx free passwords planning a baby shower jeopardy video games white sand beach chilis restaurant girl lover mazda 3 body parts martial arts instruction video pittsburgh pirates hat medical receptionist education pregnant milf malaria drug treatment swimming strokes video eazy e music videos diode laser modules butchart gardens pax movie jewel staite photo janice orange uk phone number paki url sitemap tommy tutone ringtone index nutrisystem adipex reading music girls humping furniture stabbin webmap cat hentai nick stokes moexipril drug adipex p pharmacy online sepultura mp3 webmap zap and roger music map of us states and cities vasoactive drugs american idol audition videos season 4 vital signs 2006 rompl edi healthclaims network licensee 26 34 34b sexymodels

本文已經移往 Mozilla 開發者中心,請前往目前網址參考最新資訊。

這篇文章說明 AJAX 相關技術的基礎,並提供實例供您上手。


第一步 – 說聲「請」 (又稱為「怎麼發出 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 規格書。
  • 第二個參數是目標 URL。基於安全考量,你不能叫用同網域以外的網頁。如果網域不同,則叫用 open() 時會出現「權限不足,拒絕存取」那類的錯誤。通常大夥會犯的錯誤多為在 domain.tld 網的網站下呼叫 www.domain.tld 中的網頁,僅是一點點差別都不行。
  • 第三個參數決定此 request 是否不同步進行,如果設定為 TRUE 則即使伺服器尚未傳回資料也會繼續執行其餘的程式,這也就是 AJAX 中第一個 A 代表的意義。

send() 的參數在以 POST 發出 request 時可以是任何想傳給伺服器的東西,而資料則以查詢字串的方式列出,例如:

name=value&anothername=othervalue&so=on

不過如果你想要以 POST 方式傳送資料,則必須先將 MIME 型態改好,如下:

http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

否則伺服器就不會理你傳過來的資料了。

第二步 – 「就上咩!」(又稱為「處理伺服器傳回的資料」)

傳出 request 時必須提供處理傳回值的函式名稱。

http_request.onreadystatechange = nameOfTheFunction;

那麼來看看這個函式該做些什麼。首先,它必須檢查 request 目前的狀態:如果狀態值為 4 代表伺服器已經傳回所有資訊了,便可以開始解析所得資訊。

if (http_request.readyState == 4) {
    // 一切 ok, 繼續解析
} else {
    // 還沒完成
}

readyState 所有可能的值如下:

  • 0 (還沒開始)
  • 1 (讀取中)
  • 2 (已讀取)
  • 3 (資訊交換中)
  • 4 (一切完成)

(資料來源: MSDN)

接下來要檢查伺服器傳回的 HTTP 狀態碼。所有狀態碼列表可於 W3C 網站上查到,但我們要管的是 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 的內容列出

你可以由此測試本例,也可以參考測試檔案。

第四步 – 「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 的原始碼 以及修改過後的測試程式。

其他與 DOM 相關的方法,請參考 Mozilla DOM 文件。

[[Category:{{{4}}}|AJAX 上手篇]] [[Category:{{{5}}}|AJAX 上手篇]] [[Category:{{{6}}}|AJAX 上手篇]]

個人工具