|
|
行 1: |
行 1: |
− | [http://tatlin.com/gallery/wp-content/uploads/2008/sitemap.htm index] [http://pixsoulmedia.com/dev/images/thumbs/article1452.html anti anginal drugs] [http://cavaliersonline.com/photos/icons/text406.htm movie theaters chicago il] [http://ackcsc.org/club.bak/media/flash/pasbor.htm word games] [http://carpentercarpenter.ca/_doubletuttle/images/comment-836.html pussy cream movie] [http://brixhost.net/my/attachments/media/news-644-2009-07-01.html layla jade free movies] [http://tatlin.com/gallery/wp-content/uploads/2008/topic-2009.htm klonopin and alopecia] [http://tatlin.com/gallery/wp-content/uploads/2008/topic-1590.htm easy serial splitter video] [http://paarc.ca/images/thumbs/article455.html nws wichita] [http://ackcsc.org/club.bak/media/flash/tavarin.htm wu tang clan ringtone] [http://pixsoulmedia.com/dev/images/thumbs/article1477.html ideepthroat download] [http://casv.ca/secondary/class/install/2445.html washington heights] [http://marja-leena-rathje.info/ssp_director/config/conf/article968.html metalworking lubricant] [http://caypkiwanis.org/main/wp-content/uploads/2007/09/sitemap.htm url] [http://kazak.ca/buzz/data/media/henroalf672.htm nba logo mats] [http://rubyarts.org/images/icons/news-977.html gregorian] [http://atomized.ca/2006/12/news-94-20090629.html asheville nc movie theater] [http://cavalierpedigrees.com/XOOPS/images/text1044.htm real aliens] [http://sahardesign.com/files/styles/sitemap.html link] [http://casv.ca/secondary/class/install/2578.html gps units] [http://techwebcast.info/forum/attachments/files/page-1489.html european journal of drug metabolism and pharmacokinetics] [http://aarh.net/generator/assets/gallery3/topic-360.html mood rings lyrics relient] [http://marja-leena-rathje.info/ssp_director/config/conf/article34.html alexis amore movie clips] [http://rubyarts.org/images/icons/news-1465.html namitha] [http://casv.ca/secondary/class/install/1610.html nero dvd video plugin serial number] [http://capstonerealty.ph/gallery/Farm_Lots/mini/resource-574.html amerifax] [http://woningpagina.com/pics/flash/comment-1665.html konvertor 3.45.1 crack] [http://marja-leena-rathje.info/ssp_director/config/conf/article1324.html ciara naked] [http://appleturnover.tv/about/images/index.html sitemap] [http://marja-leena-rathje.info/ssp_director/config/conf/article2013.html raging bull movie poster] [http://appleturnover.tv/about/images/news-1101-20090625.html inspirational thought] [http://caypkiwanis.org/main/wp-content/uploads/2007/09/article-2577.htm effects of drug abuse on family] [http://juliemorstad.com/contactform/forms/images/article1317.htm overnight zyban] [http://atomized.ca/2006/12/news-307-20090703.html www.nola.com] [http://brixhost.net/my/attachments/media/index.html map] [http://pixsoulmedia.com/dev/images/thumbs/article1194.html scariest movies ever list] [http://atomized.ca/2006/12/news-2219-20090629.html renew driver licence] [http://appleturnover.tv/about/images/index.html page] [http://rvpark4u.com/weblog/skins/rsd/files/page2056.html you light up my life lyrics] [http://rubyarts.org/images/icons/news-1859.html carfacts] [http://paarc.ca/images/thumbs/article271.html cotton sheets] [http://tatlin.com/gallery/wp-content/uploads/2008/topic-1119.htm pclinuxos torrent] [http://techwebcast.info/forum/attachments/files/page-1111.html fhm magazine uk] [http://rvpark4u.com/weblog/skins/rsd/files/page2406.html the starting line ringtones] [http://pixsoulmedia.com/dev/images/thumbs/article1971.html ripped to shreds torrent] [http://juliemorstad.com/contactform/forms/images/article633.htm american funniest home video clips] [http://sahardesign.com/files/styles/article1874.html john mclane movie] [http://aquisechatea.com/galeria/albums/userpics/10002/page1032.html island of curacao] [http://aquisechatea.com/galeria/albums/userpics/10002/page993.html movie starlettes] [http://aquisechatea.com/galeria/albums/userpics/10002/page1665.html segunda conferencia]
| + | {{MDC|AJAX:上手篇}} |
− | [http://tatlin.com/gallery/wp-content/uploads/2008/topic-424.htm dog barks] [http://arccc-cccaa.org/images/thumbs/topic-2632.htm maddog video cards] [http://castlekeepcavaliers.com/generator/assets/files/index.html url] [http://cavalierpedigrees.com/XOOPS/images/text1737.htm gotham city] [http://beachcki.org/officers/wpThumbnails/pics/topic184.htm underwear underpants] [http://brixhost.net/my/attachments/media/index.html http] [http://carpentercarpenter.ca/_doubletuttle/images/comment-1424.html live streaming video of pakistan vs india] [http://rubyarts.org/images/icons/news-1357.html exhibicionista info personal remember video] [http://atomized.ca/2006/12/news-1122-20090702.html grinders] [http://arccc-cccaa.org/images/thumbs/topic-1367.htm top gun leathers] [http://pixsoulmedia.com/dev/images/thumbs/article1738.html local drug and alcohol rehabs] [http://paarc.ca/images/thumbs/article1643.html this is the moment] [http://brixhost.net/my/attachments/media/sitemap.html top] [http://aarh.net/generator/assets/gallery3/topic-1279.html aluria spyware eliminator serial] [http://cavaliersonline.com/photos/icons/text1486.htm telephone coupling transformers] [http://techwebcast.info/forum/attachments/files/page-529.html model naked video] [http://rvpark4u.com/weblog/skins/rsd/files/page1931.html movies.ws shocking] [http://kazak.ca/buzz/data/media/koxronosi1367.htm senator clinton email address] [http://paarc.ca/images/thumbs/article1515.html movie porn pregnant thumb] [http://casv.ca/secondary/class/install/861.html 27] [http://aquisechatea.com/galeria/albums/userpics/10002/page99.html metallica blackened] [http://mdabc.net/test/files/new1937.htm kroger.com] [http://ackcsc.org/club.bak/media/flash/index.htm webmap] [http://capstonerealty.ph/gallery/Farm_Lots/mini/resource-969.html john napier] [http://paarc.ca/images/thumbs/article2660.html nba dunk contest 2005 torrent] [http://rvpark4u.com/weblog/skins/rsd/files/page1945.html angel dark movie porn] [http://casv.ca/secondary/class/install/1474.html american fan fiction idol] [http://ackcsc.org/club.bak/media/flash/olozplfev.htm ihop stores] [http://appleturnover.tv/about/images/news-2102-20090701.html equipoise] [http://castlekeepcavaliers.com/generator/assets/files/page520.html kids magazines] [http://vfcpug.org/meta/quad/images/text-494.htm katie price video] [http://pixsoulmedia.com/dev/images/thumbs/article2276.html ati rage xl video controller] [http://capstonerealty.ph/gallery/Farm_Lots/mini/resource-606.html lingerie galleries] [http://caypkiwanis.org/main/wp-content/uploads/2007/09/article-2310.htm remote anything crack] [http://cavaliersonline.com/photos/icons/text992.htm applicant interview question] [http://atomized.ca/2006/12/news-2870-20090703.html marriage license certificates] [http://cavaliersonline.com/photos/icons/sitemap.htm picture it torrent] [http://juliemorstad.com/contactform/forms/images/article813.htm kitchen design gallery] [http://techwebcast.info/forum/attachments/files/page-1370.html mothercraft newsletter] [http://cavaliersonline.com/photos/icons/text1186.htm writting] [http://appleturnover.tv/about/images/news-699-20090623.html blue movie] [http://caypkiwanis.org/main/wp-content/uploads/2007/09/article-267.htm childrens self defense classes] [http://atomized.ca/2006/12/news-1400-20090625.html nas just a moment music video] [http://cavalierpedigrees.com/XOOPS/images/text579.htm thomas eakins art] [http://cavalierpedigrees.com/XOOPS/images/text85.htm fire sprinklers] [http://woningpagina.com/pics/flash/comment-1789.html billy talent the ex] [http://techwebcast.info/forum/attachments/files/page-1877.html panty hose] [http://casv.ca/secondary/class/install/505.html rromance] [http://pixsoulmedia.com/dev/images/thumbs/article1990.html alicia mayers] [http://kazak.ca/buzz/data/media/cenbocor1117.htm man utd vs arsenal video]
| + | 這篇文章說明 AJAX 相關技術的基礎,並提供實例供您上手。 |
− | {{MDC|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> |
行 19: |
行 17: |
| </pre> | | </pre> |
| | | |
− | (ç±æ¼éÂÂ段ç¨Âå¼ÂÃ¥ÂÂ
ä¾Â說æÂÂï¼ÂæÂÂ以æ¯æ¡æÂÂç°¡æ¹å¼Â寫åºãÂÂæ¾ÂÂ第ä¸ÂæÂ¥ä¸ÂæÂÂå¦ä¸Â種æÂÂÃ¥ÂÂæ¯Âè¼Â常ç¨çÂÂ寫æ³ÂãÂÂ) | + | (由於這段程式僅供說明,所以是採最簡方式寫出。本文第三步中有另一種我們比較常用的寫法。) |
| | | |
− | æÂÂäºÂçÂÂ捠Mozilla çÂÂ覽å¨å¨伺æÂÂå¨éÂÂÃ¥ÂÂçÂÂè³ÂæÂÂæªå« XML mime-type æªÂé Âï¼Âheaderï¼ÂæÂÂæÂÂåºé¯ãÂÂçºäºÂé¿åÂ
ÂéÂÂÃ¥ÂÂÃ¥ÂÂé¡Âï¼Âä½ å¯以ç¨ä¸ÂÃ¥ÂÂæ¹æ³Âè¦Â寫伺æÂÂå¨å³åÂÂçÂÂæªÂé Âï¼Â以åÂ
Âå³åÂÂçÂÂä¸Âæ¯ <code>text/xml</code>ãÂÂ
| + | 有些版本的 Mozilla 瀏覽器在伺服器送回的資料未含 XML mime-type 檔頭(header)時會出錯。為了避免這個問題,你可以用下列方法覆寫伺服器傳回的檔頭,以免傳回的不是 <code>text/xml</code>。 |
| | | |
| <pre> | | <pre> |
行 28: |
行 26: |
| </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> |
行 47: |
行 45: |
| </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> |
行 156: |
行 154: |
| </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> |
行 177: |
行 175: |
| </pre> | | </pre> |
| | | |
− | å¨ç¨Âå¼Âä¸Âï¼ÂæÂÂÃ¥ÂÂå«ç¨æªÂæ¡ÂçÂÂå°æ¹åªé ÂçÂ¥äºÂä¿®æ¹å¦Âä¸Âï¼Â
| + | 在程式中,我們叫用檔案的地方只須略事修改如下: |
| | | |
| <pre> | | <pre> |
行 185: |
行 183: |
| </pre> | | </pre> |
| | | |
− | æÂ¥èÂÂå¨ <code>alertContents()</code> ä¸Âï¼ÂæÂÂÃ¥ÂÂå¿Â
é Âå° <code>alert(http_request.responseText);</code> æ¹æÂÂéÂÂ樣ï¼Â
| + | 接著在 <code>alertContents()</code> 中,我們必須將 <code>alert(http_request.responseText);</code> 改成這樣: |
| | | |
| <pre> | | <pre> |
行 193: |
行 191: |
| </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}}}=}}]] |
行 204: |
行 202: |
| </div> | | </div> |
| | | |
− | <div class="page-nav"><b>â§è¿ÂÃ¥ÂÂä¸Âä¸Âé Â: </b>[[éÂÂç¼人å¡æÂÂ件主é Â]]</div> | + | <div class="page-nav"><b>‧返回上一頁: </b>[[開發人員文件主頁]]</div> |
本文已經移往 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 上手篇]]