jquery ajax
使用jquery的ajax進行非同步資料傳輸,如果是使用javascript可以使用XMLHttpRequest函數去處理,由於jquery處理掉不少瀏覽器差異,使用上比較方便,加上碰過的專案大多為了特效都有使用,這邊只記錄自己比較熟的jquery部分。
ajax主要用途是用來處理不換頁更新顯示資料,延後載入部分資料增加使用者體驗,或是處理一些即時的資料紀錄去後台等等,只要頁面沒有刷新而可以變動的東西幾乎都是使用他來處理。
基本用法
這邊直接上範例。
var request = $.ajax({
url: "page.html",//目標頁面
method: "POST",//模式 post或get
data: { id : menuId
, data : 'test'},//資料 用,分開
dataType: "html" //取得頁面的資料類型,除了html以外json也很常用
});
//成功後執行
request.done(function( msg ) {
$( "#log" ).html( msg );
});
//失敗的話執行
request.fail(function( jqXHR, textStatus ) {
alert( "Request failed: " + textStatus );
});
或是這樣寫
$.ajax({
url: 'page.html',
method: "POST",
data: { id : menuId
, data : 'test'},
dataType: "json",
success: function (response) {
//成功後執行
},
error: function (jqXHR, exception) {
//失敗的話執行
}
});
還有一些其他函數或設定可以使用,一般來說這些可以應付多數狀況。
送出整個form表單
一開始的時候還笨笨的每個欄位用id或name來抓,後來才知道有serializeArray這個函數能使用,所以紀錄一下。
var pdata = $('#repform').serializeArray();
//額外增加參數
pdata.push({name: "savemode", value: 'auto'});
$.ajax({
type: "POST",
url: 'page.html',
data: $.param(pdata),
dataType: "json",
success: function(data){
}
});
用FormData處理,可以處理含有檔案的表單
$("#upform").submit(function(e) {
e.preventDefault();
var formData = new FormData(this);
$.ajax({
url: $(this).attr("action"),
type: 'POST',
data: formData,
dataType: "json",
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
});
錯誤訊息顯示
純紀錄,參考https://stackoverflow.com/questions/6792878/jquery-ajax-error-function
$.ajax({
url: 'page.html',
success: function (response) {
},
error: function (jqXHR, exception, errorThrown) {
var msg = '';
if (jqXHR.status === 0) {
msg = 'Not connect.\n Verify Network.';
} else if (jqXHR.status == 404) {
msg = 'Requested page not found. [404]';
} else if (jqXHR.status == 500) {
msg = 'Internal Server Error [500].';
} else if (exception === 'parsererror') {
msg = 'Requested JSON parse failed.';
} else if (exception === 'timeout') {
msg = 'Time out error.';
} else if (exception === 'abort') {
msg = 'Ajax request aborted.';
} else {
msg = 'Uncaught Error.\n' + jqXHR.responseText;
}
$('#post').html(msg);
console.log(textStatus, errorThrown);
},
});