====== Head Rush Ajax 讀書筆記 ====== ===== Chapter Three ===== ==== HTML ==== 將 Javascript 獨立成檔案。在 和 中間最好空一格,不然有些瀏覽器無法載入! 第一個 div,主要控制 coffeemaker1-status 中的文字。 透過 document.getElementById("coffeemaker1-status"); 來存取。

Coffee Maker #1

Coffee Maker #1

Idle
整個網頁的第一個 form,也就是 document.forms[0]。
... // forms[0].size Small Medium Large ... // forms[0].beverage Mocha Latte Cappucino ...
==== ajax.js ==== function createRequest() { var request = null; try { request = new XMLHttpRequest(); } catch (trymicrosoft) { ...... // for M$ } if (request == null) alert ("Error creating request object!"); else { return request; // 傳出初始好的物件 } } // 分成兩個要求,避免後面的請求把前面的蓋掉 var request1 = createRequest(); var request2 = createRequest(); ==== coffee.js ==== // 不同的 request 用不同的物件,url 也不一樣 function sendRequest(request, url) { request.onreadystatechange = serveDrink; request.open("GET", url, true); request.send(null); } 當伺服器的回應完成之後,備妥狀態為 4,即時再度請求物件,也無法重新設定備妥狀態,使 request1.readyState == 4 會永遠成立,但 readyState 是唯獨屬性,只能由瀏覽器去更改,因此以建立新物件的方式重設備妥狀態。 function serveDrink() { if (request1.readyState == 4) { if (request1.status == 200) { var response = request1.responseText; // 取得 server 傳回來的資料 var whichCoffeemaker = response.substring(0,1); // 分解字串 var name = response.substring(1,response.length); if (whichCoffeemaker == "1") { var coffeemakerStatusDiv1 = document.getElementById("coffeemaker1-status"); replaceText(coffeemakerStatusDiv1, "Idle"); } else { var coffeemakerStatusDiv2 = document.getElementById("coffeemaker2-status"); replaceText(coffeemakerStatusDiv2, "Idle"); } alert(name + ", your coffee is ready!"); request1 = createRequest(); // 利用重新創造一個新物件的方式讓 readyState 重設 } } else if (request2.readyState == 4) { if (request2.status == 200) { ... ... 同上 1 ... ... } else alert("Error! Request status is " + request.status); } } // 從網頁表單接受訂單 function orderCoffee() { var name = document.getElementById("name").value; var beverage = getBeverage(); var size = getSize(); var coffeemakerStatusDiv1 = document.getElementById("coffeemaker1-status"); var status = getText(coffeemakerStatusDiv1); if (status == "Idle") { replaceText(coffeemakerStatusDiv1, "Brewing " + name + "'s " + size + " " + beverage); document.forms[0].reset(); // 成功送出資料後清除表單 var url = "coffeemaker.php?name=" + escape(name) + "&size=" + escape(size) + "&beverage=" + escape(beverage) + "&coffeemaker=1"; sendRequest(request1, url); } else { var coffeemakerStatusDiv2 = document.getElementById("coffeemaker2-status"); var status = getText(coffeemakerStatusDiv2); if (status == "Idle") { ... 同上 ... } else { alert("Sorry! Both coffee makers are busy. Try again later."); } } } // 利用 DOM 取出所圈選的資料 function getSize() { var sizeGroup = document.forms[0].size; // 整個網頁中第一個 form 裡的 size var i; for (i=0; i