240 likes | 522 Views
DOJO AJAX. IDIC By Cwlin. 何謂 AJAX. AJAX 的全名為 Asynchronous JavaScript and XML 使用 JavaScript 透過 XML 非同部存取資料的技術 XML 是一種可通用來 表達 資料的語言 解決 JavaScript 無法存取資料庫的限制 以 XML 做為媒介解決了 JavaScript 無法存取資料庫的問題 可以 透過 JavaScript 更新網頁上的內容. 資料處理的同步與非同步. 參考自 O’Reilly 網站. 實務上 AJAX 的應用.
E N D
DOJO AJAX IDIC By Cwlin
何謂 AJAX • AJAX 的全名為 Asynchronous JavaScript and XML • 使用 JavaScript 透過 XML 非同部存取資料的技術 • XML 是一種可通用來表達資料的語言 • 解決 JavaScript 無法存取資料庫的限制 • 以 XML 做為媒介解決了 JavaScript 無法存取資料庫的問題 • 可以透過 JavaScript 更新網頁上的內容
資料處理的同步與非同步 參考自 O’Reilly 網站
實務上 AJAX 的應用 • 由於 JavaScript 在不同瀏覽器所支援程度的不同,因此 AJAX 語法中做了許多兼容的判斷 • 因此在實務上會拿已有的 AJAX Framework 使用,如: Dojo, jQuery, Prototype 以節省時間,專心撰寫主要的程式 • AJAX 的使用以較少使用 XML 取而代之的是 JSON 格式,由於它更為簡便與易於存取
JSON • JSON,JavaScript Object Notation 一種以文字為基礎的資料表示格式 • 由於它的表達格式簡單、資料量小、易於轉換,已逐漸取代 XML 的應用 • 資料的轉換採用序列化(serialize) • 將程式中的變數、陣列、物件轉換為可以傳輸的格式(字串),傳輸完再做反序列化(deserialize)即可直接使用
使用 Dojo AJAX • AJAX 其實就如同一般開啟網頁傳送資料 • 差別在於 AJAX 是透過 JavaScript 在背後執行 • Dojo 針對 AJAX 資料存取的方式提供了兩個方法: • xhr.get– 以 GET 的方式存取資料 • xhr.post– 以 POST 的方式存取資料 • 在使用 AJAX 前必須要知道所要存取資料的網址,為產生資料的後端程式,如: PHP
Dojo 使用 AJAX 的範例 • 向 get-content.php取得資料並將取得的資料放進 ID為contentNode 的 HTML 標籤裡 require(["dojo/_base/xhr", "dojo/dom", "dojo/domReady!"], function(xhr, dom) { // Using xhr.get, as very little information is being sent xhr.get({ // The URL of the request url: "get-content.php", // The success callback with result from server load: function(newContent) { dom.byId("contentNode").innerHTML = newContent; }, // The error handler error: function() { // Do nothing -- keep old content there } }); });
參數說明 • url • 存取資料的網址,通常是後端的程式,如: PHP • content • 傳送給網頁伺服器的資料 • load • 載入資料時會執行的函數,載入完的資料會以參數的方式傳入這個函數,如: newContent • error • 發生錯誤時會執行的函數
非同步程式的特點 • 非同步程式的執行不是按照順序的 • 由於資料送出後回應的時間均不同,因此執行的順序與結果的順序不一定會一致 • 非同步函式的呼叫並不會收到結果後才繼續執行後面的函數 • 非同步函式的執行不論是否有收到結果都會繼續執行後面的程式碼
練習一 • 以 AJAX 做一個按鈕點選後從 PHP 取得目前日期,並更新到畫面上
使用 JSON 傳遞資料 • AJAX的資料傳送介於前端(JavaScript)與後端(PHP)程式之間,因此傳送前須將格式轉換為兩個語言共同的格式 • PHP 轉換 JSON 格式的方法 • json_encode($data) • 將變數轉換為 JSON 格式的資料 • json_decode($json) • 將 JSON 格式的資料轉換回變數 • JavaScript 使用 Dojo 轉換 JSON 格式的方法 • json.parse(json) • 將 JSON 格式的資料轉換為變數 • json.stringify(data) • 將變數轉換為 JSON格式的資料
Dojo JSON • 需要載入 dojo/json元件 require(["dojo/json"], function(json){ json.parse("{x: 5, y: 3}"); }); require(["dojo/json"], function(json){ json.stringify({x: 5, y: 3}); });
PHP 轉換 JSON 格式 • 將變數轉換為 JSON 格式並印出 • 將收到的 JSON 轉換為變數並以 var_dump印出 • 通常由 $_GET 及 $_POST 取得資料 <?php $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); echo json_encode($arr); ?> <?php $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); ?>
Dojo AJAX – 以 JSON 格式存取 • 加入參數 handleAs: "json"會自動將收到的 JSON 資料轉換回變數 • JSON 的資料要以物件的方式存取 require(["dojo/_base/xhr", "dojo/dom", "dojo/domReady!"], function(xhr, dom) { // Using dojo.xhrGet, as very little information is being sent xhr.get({ // The URL of the request url: "get-content.php", handleAs: "json", // The success callback with result from server load: function(jsonData) { dom.byId("newsContainerNode").innerHTML = jsonData.content; }, // The error handler error: function() { // Do nothing -- keep old content there } }); });
練習二 • 做一個註冊的表單包含姓名,電子郵件,以AJAX 的方式傳送到 PHP,PHP 回傳註冊成功的訊息並顯示在畫面上
AJAX 的防呆 • 避免相同動作重複執行 • 送出 AJAX 訊息後要將事件停用直到收到結果 • 介面在尚未取得結果前需顯示載入的圖示,並避免使用者繼續更改介面內容 • 將表單元件停用(Disable) • dojox/widget/Standby 的使用
Dojo Standby • Dojo Standby 的元件主要用來解決 AJAX在存取資料時,避免使用者未取得結果就進行下一個動作,並顯示載入中的圖示 <div id="basic" style="width: 300px; height: 150px; background-color: yellow; border-style: solid; border-width: 2px;"></div> <div id="basicStandby1" data-dojo-type="dojox/widget/Standby" data-dojo-props="target:'basic'"></div> <script type="text/javascript"> require([ "dijit/registry", "dojo/parser", "dojox/widget/Standby", "dijit/form/Button"], function(registry){ registry.byId("basicStandby1").show(); }); </script>
Dojo StandBy (續) • 顯示讀取圖示 • registry.byId("basicStandby1").show(); • 取消顯示讀取圖示 • registry.byId("basicStandby1").hide();
練習三 • 承練習二,在註冊的過程中以 StandBy元件顯示載入中的圖示
Dojo Store • Dojo Store 定義了一個共通存取的介面可以存取不同種類的資料
Dojo Store (續) • 透過 Dojo Store 可以使用同樣的資料內容代入不同的 Dojo 表單元件,產生不同的結果,如: Dojo DataGrid, Dojo FilteringSelect, Dojo Tree • Dojo Store 的資料格式 { "identifier": "abbreviation", "label": "name", "items": [ { "abbreviation": "AL", "name": "Alabama" }, ... other 48 states here ... { "abbreviation": "WY", "name": "Wyoming" } ] }
PHP 產生 JSON 資料 • 使用 PHP 產生相同格式的陣列再轉換為 JSON $data = array(); $data["identifier"] = "abbreviation"; $data["label"] = "name"; $data["items"] = array(); $data["items"][] = array( "abbreviation" => "AL", "name" => "Alabama" ); $data["items"][] = array( "abbreviation" => "WY", "name" => "Wyoming" ); echo json_encode($data);
Dojo 使用 Store 載入資料 • JavaScript • HTML require(["dojo/parser", "dojo/data/ItemFileReadStore", "dijit/form/FilteringSelect"]); <div id="countryStore" data-dojo-type="dojo/data/ItemFileReadStore" data-dojo-props="url:'get_country.php', clearOnClose:true" data-dojo-id="myStore"> </div> <div data-dojo-type="dijit/form/FilteringSelect" data-dojo-props="store: myStore, searchAttr: 'name'"></div>
作業 • 設計一註冊程式,表單需填入帳號、密碼、姓名、E-mail,以 AJAX 方式傳送到 PHP 並存入資料庫 • 帳號填寫完畢,以事件的方式呼叫向 PHP 查詢使用用者是否已存在並顯示在帳號欄位後面 • 資料傳送過程中需顯示讀取中的畫面 • 若帳號已存在則不允許註冊 • 註冊後需顯示註冊成功的訊息 • 不可使用 alert() 顯示訊息