雲端教學課程
Ajax基礎
「Asynchronous JavaScript and XML」
(非同步的JavaScript與XML技術)
本章必需要有的基礎:
MySQL、PHP、PDO、javascript、json、jQuery
What ajax ?
頁面不刷新,動態的載入資料。

http://www.9lessons.info/2008/08/jquery-ajax-and-php-projects-9lessons.html
用在搜尋

http://www.9lessons.info/2009/06/autosuggestion-with-jquery-ajax-and-php.html
XML與JSON資料格式比較
http://www.auroraedialliance.com/blog/bid/184388/Part-1-The-What-Why-and-How-of-JSON-for-EDI-Integration-Specialists
錯誤寫法
<?php echo '{"內容":"' . $data . '"}';
會引法的問題,輕則JSON斷行格式錯誤
{'內容':'這是很正常的第一段。
第二段之我斷行了阿阿阿阿阿!!!!'}
{"\u5167\u5bb9":"\u9019\u662f\u5f88\u6b63\u5e38\u7684\u7b2c\u4e00\u6bb5\u3002\r\n\u6211\u65b7\u884c\u4e86\u963f\u963f\u963f\u963f\u963f!!!!\r\n"}
更嚴重一點

http://blog.gslin.org/archives/2014/01/06/4071/
正確寫法,JSON不要自己組
用函式並將特殊字元全轉成hex、送header
<?php header('Content-Type: application/json; charset=utf-8');//記得送檔案格式、編碼 $data = array( 'Contacts' => array( array( 'FirstName' => 'lai', 'Name' => 'jackai', 'age' => 18 ), array( 'FirstName' => "</script><script>alert('hacked');//'", 'Name' => 'def', 'age' => 15 ) )
); echo json_encode( $data ,JSON_HEX_TAG);//編碼輸出,轉換特殊字元成16進制
練習:用PHP產生JSON
可以用jsonlint把json解回來看:http://jsonlint.com/{ "Contacts": [ { "FirstName": "lai", "Name": "jackai", "age": 18 }, { "FirstName": "abc", "Name": "def", "age": 15 }, { "FirstName": "姓", "Name": "名字", "age": 99
} ] }
jQuery Ajax接收資料
- 引入jQuery Library
<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
- 執行Ajax撈資料..........................................................
<script type="text/javascript"> function ajax_data(){ $.ajax({ url:'json.php', dataType:"json", success: function(data){ console.log(data); } }); } </script> <button onclick="ajax_data();">ajax資料</button>
Ajax - POST/GET
如果沒設type,預設會用GET傳參數。
GET參數可能有保留字的解法:encodeURIComponent(str)
<script type="text/javascript">
function ajax_data(){
$.ajax({
url:'json.php?action=action_value',
data:{
'test':'test_value',
'number_value':123
},
type:"POST",
dataType:"json",
success: function(data){
console.log(data);
}
});
}
</script>
重要資料一定要用POST再回傳
json hijacking
-
google解法:json前放一個 while(1);
- Facebook解法:json前放一個for(;;);
- 網路上解法:/*{Json_Data}
- 最簡單解法:用POST傳資料
說明:
詳細資料
練習:配合資料庫撈資料
像簡報第二頁的Facebook搜尋名字一樣,
輸入字就在底下顯示相關資料。
題示:
- 可以使用$('#id').html('html字串')把原本HTML蓋掉。
- POST資料給MySQL查詢,再回傳JSON格式。
- 文字輸入事件:onkeyup

練習2:配合頁面捲動,載入資料
像臉書一樣,向下捲動就載入較舊的資料進來。
題示:
- jQuery有個function能一直加資料$('#id').append('html');
- 可以先在頁面底端加一個"載入更多資料"的按紐,
再處理捲軸事件。

http://www.sanwebe.com/2013/05/auto-load-records-on-page-scroll
Ajax再進階,Pjax
只更新一部份頁面,降低伺服器負擔。

http://ntotten.com/2012/04/09/building-super-fast-web-apps-with-pjax/
pjax優點、注意事項
偷借一下JSDC上的簡報:Paul Li/ Yahoo
樸實與浮華 (Plain and Vanity) / (Usability & Performance)
pjax = pushState + ajax
IE以下的瀏覽器不支援pushstate,
會轉回沒有pjax方法切換

練習:做出像Facebook一樣的pjax
左邊點選目錄後,主畫面切換。
Ajax基礎
By jackai
Ajax基礎
- 3,606