一、說明 「互動式網頁」概念由來已久,但實作的的方式一直不斷更新,如javascript, Java applet, flash, css等。其中Javscript支援度高、應用廣、學習容易,很不錯的語言。
在此透過jQuery來使用Javascript, AJAX
本文中採用Google Chrome瀏覽器及其開發人員工具
二、主要應用
選擇器(Selector)
DOM控制
資料處理
AJAX
三、練習模版 3.1 增加路徑常數
3.2 建立Controller
3.3 建立View
3.4 建立JS檔
3.5 查看結果
四、選擇器(jQuery Selector) 使用tag, id, class取得DOM,並讀取物件內容
4.1 使用tag selector 讀取tag:h1內容字串 在函式 _initialize 中寫入下列程式碼後,按ctrl+F5重整網頁
1 2 3 4 5 6 var text = $('h1' ).text ();console .log ('----' );console .log ('tag:h1的內容為:' + text);console .log ('----' );
按F12打開「開發人員工具」,移到console頁籤
JS翻釋:使用tag選擇器尋找名為h1的元件,並取得元件內容字串
tag為HTML標籤名稱,參考文件 HTML5 Tutorial
4.2 使用id selector 寫入「測試字串」至id=”ctrl-message”的元件 在函式 _initialize 中寫入下列程式碼後,按ctrl+F5重整網頁
1 2 $('#ctrl-message' ).text ('測試字串' );
JS翻釋:使用ID選擇器(#)尋找id為ctrl-message的元件,並將字串「測試字串」寫入元件內容
4.3 使用class selector 變更class=”ctrl-btn”按鈕的元件的顏色為btn-danger 在函式 _initialize 中寫入下列程式碼後,按ctrl+F5重整網頁
1 2 $('.ctrl-btn' ).removeClass ('btn-warning' ).addClass ('btn-danger' );
JS翻釋:使用class選擇器(.)尋找含有class為ctrl-btn的元件,並移除class btn-warning、增加class btn-danger
4.4 查看結果
五、DOM控制 5.1 結構 5.1.1 移除按鈕 在函式 _initialize 中寫入下列程式碼後,按ctrl+F5重整網頁
1 2 $('.ctrl-btn' ).remove ();
JS翻釋:使用class選擇器(.)尋找含有class為ctrl-btn的元件,並移除該元件
5.1.2 建立表格 在函式 _initialize 中寫入下列程式碼後,按ctrl+F5重整網頁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 var tmp, table, thead, tbody, tr, th, td;tmp = $('<div></div>' ); thead = $('<thead></thead>' ).appendTo (tmp); tr = $('<tr></tr>' ).appendTo (thead); th = $('<th></th>' ).appendTo (tr); th.text ('Count' ); th = $('<th></th>' ).appendTo (tr); th.text ('Name' ); th = $('<th>Gender</th>' ).appendTo (tr); tbody = $('<tbody></tbody>' ).appendTo (tmp); tr = $('<tr></tr>' ).appendTo (tbody); td = $('<td></td>' ).appendTo (tr); td.text ('1' ); td = $('<td></td>' ).appendTo (tr); td.text ('Joe' ); td = $('<td>male</td>' ).appendTo (tr); table = $('.ctrl-table' ); tmp.children ().appendTo (table); console .log (table.html ());
參考文件:jQuery Add , jQuery Remove
5.2 事件 5.2.1 按下按鈕時,變更tag:h1文字為「** Javascript Training **」 在函式 _evenBind 中寫入下列程式碼後,按ctrl+F5重整網頁
1 2 3 4 $('.ctrl-btn' ).on ('click' , function ( ) { $('h1' ).text ('** Javascript Training **' ); });
JS翻釋:
當class為ctrl-btn的元件,在(on)按下click時,執行匿名函式
匿名函式:對tag為h1的元件內容改寫為「** Javascript Training **」
5.2.2 偵測滑鼠座標 在函式 _evenBind 中寫入下列程式碼後,按ctrl+F5重整網頁
1 2 3 4 5 6 7 8 9 10 $(document ).on ('mousemove' , function (ev ) { ev = ev || window .event ; if (ev.pageX || ev.pageY ) { $('.ctrl-message' ).html ('X: ' + ev.pageX + '<br>Y: ' + ev.pageY ); } });
JS翻釋:
當在整個文件區(document)中偵測到滑鼠移動事件(mousemove)時,執行匿名函式
匿名函式:取得事件物件,如果事件物件含有座標資訊,在ctrl-message元件中印出座標資訊
參考文件:jQuery Events
5.3 查看結果
六、AJAX AJAX即「Asynchronous JavaScript and XML」(非同步的JavaScript與XML技術),使用AJAX執行前後端資料交換有助於減少資料量,非同步特性讓ajax處理時,可同時處理本其他JS程式,讓網頁執行更順暢更多樣化。
AJAX的目的可粗略分為建立(create)、讀取(read)、更新(update)、刪除(delete)。
在此使用RESTFul Style 實作ajax前後端資料交換
6.1 修改AJAX server side相關路徑 編輯檔案:assets/js/jsTraining/jsTraining.js
1 2 3 4 5 _ajaxUrls : { accountApi : '/js_training/ajax' , },
6.2 建立伺服器端接收函式 檔案:application/controllers/Js_training.php 增加下列函式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 public function ajax ($id = null ) { $method = strtoupper ($_SERVER ['REQUEST_METHOD' ]); $data = $this ->input->input_stream (); switch ($method ) { case 'POST' : $this ->_create ($data ); break ; case 'GET' : if (empty ($id )) { $this ->_list (); } else { $this ->_read ($id ); } break ; case 'PATCH' : case 'PUT' : $this ->_update ($data , $id ); break ; case 'DELETE' : if (empty ($id )) { http_response_code (404 ); echo 'No Delete ID' ; exit ; } else { $this ->_delete ($id ); } break ; } } protected function _create ($data ) { $opt = [ 'type' => '新增一筆' , 'data' => $data , ]; echo json_encode ($opt ); } protected function _list ( ) { $opt = [ 'type' => '讀取全部' , 'head' => [ 'name' , 'location' , ], 'data' => [ [ 'name' => 'John' , 'location' => 'Boston' , ], [ 'name' => 'Joe' , 'location' => 'New York' , ], [ 'name' => 'Gary' , 'location' => 'Taipei' , ], ], ]; echo json_encode ($opt ); } protected function _read ($id ) { $opt = [ 'type' => '讀取一筆' , 'id' => $id , ]; echo json_encode ($opt ); } protected function _update ($data , $id ) { $opt = [ 'type' => '更新一筆' , 'data' => $data , 'id' => $id , ]; echo json_encode ($opt ); } protected function _delete ($id ) { $opt = [ 'type' => '刪除一筆' , 'id' => $id , ]; echo json_encode ($opt ); }
6.3 Create 6.3.1 程式碼
新增一筆 在函式 _initialize 中寫入下列程式碼後,按ctrl+F5重整網頁1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $.ajax ({ method : 'POST' , url : self._ajaxUrls .accountApi , data : { name : 'John' , location : 'Boston' }, dataType : 'json' , }).done (function (data ) { $('<div>' + JSON .stringify (data) + '</div>' ).appendTo ($('.ctrl-message' )); console .log (data); }).fail (function (jqXHR ) { $('<div>' + jqXHR.responseText + '</div>' ).appendTo ($('.ctrl-message' )); console .log (jqXHR); });
示範AJAX Request & Reponse
6.3.2查看結果
6.4 Read
讀取全部
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 $.ajax ({ method : 'GET' , url : self._ajaxUrls .accountApi , dataType : 'json' , }).done (function (data ) { $('<div>' + JSON .stringify (data) + '</div>' ).appendTo ($('.ctrl-message' )); var tmp, table, thead, tbody, tr, th, td; tmp = $('<div></div>' ); thead = $('<thead></thead>' ).appendTo (tmp); tbody = $('<tbody></tbody>' ).appendTo (tmp); tr = $('<tr class="bg-info"></tr>' ).appendTo (thead); $.each (data.head , function (index, value ) { th = $('<th>' +value+'</th>' ).appendTo (tr); }); $.each (data.data , function (index1, value1 ) { tr = $('<tr></tr>' ).appendTo (tbody); $.each (value1, function (index2, value2 ) { td = $('<td>' +value2+'</td>' ).appendTo (tr); }); }); table = $('.ctrl-table' ); tmp.children ().appendTo (table); });
陣列資料配合$.each建立表格
讀取一筆
1 2 3 4 5 6 7 8 9 10 11 12 $.ajax ({ method : 'GET' , url : self._ajaxUrls .accountApi + '/3' , dataType : 'json' , }).done (function (data ) { $('<div>' + JSON .stringify (data) + '</div>' ).appendTo ($('.ctrl-message' )); });
參考文件:$.each()
6.5 Update
更新一筆1 2 3 4 5 6 7 8 9 10 11 12 $.ajax ({ method : 'PUT' , url : self._ajaxUrls .accountApi , data : { name : 'John' , location : 'Boston' }, dataType : 'json' , }).done (function (data ) { $('<div>' + JSON .stringify (data) + '</div>' ).appendTo ($('.ctrl-message' )); });
6.6 Delete
刪除錯誤 No Delete ID
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $.ajax ({ method : 'DELETE' , url : self._ajaxUrls .accountApi , dataType : 'json' , }).done (function (data ) { $('<div>' + JSON .stringify (data) + '</div>' ).appendTo ($('.ctrl-message' )); }).fail (function (jqXHR ) { $('<div>' + jqXHR.responseText + '</div>' ).appendTo ($('.ctrl-message' )); console .log (jqXHR); });
刪除一筆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $.ajax ({ method : 'DELETE' , url : self._ajaxUrls .accountApi + '/2' , dataType : 'json' , }).done (function (data ) { $('<div>' + JSON .stringify (data) + '</div>' ).appendTo ($('.ctrl-message' )); }).fail (function (jqXHR ) { $('<div>' + jqXHR.responseText + '</div>' ).appendTo ($('.ctrl-message' )); console .log (jqXHR); });
參考文件:
6.7 資料交換要點
七、參考 7.1 知識
7.2 官網
7.3 教程
未完待續