JQuery中ajax的使用與快取問題的解決方法

Hoking發表於2018-05-19

1:GET訪問 瀏覽器 認為 是等冪的
就是 一個相同的URL 只有一個結果[相同是指 整個URL字串完全匹配]
所以 第二次訪問的時候 如果 URL字串沒變化 瀏覽器是 直接拿出了第一次訪問的結果
 POST則 認為是一個 變動性 訪問 (瀏覽器 認為 POST的提交 必定是 有改變的)
防止 GET 的 等冪 訪問 就在URL後面加上 ?+new Date();,[總之就是使每次訪問的URL字串不一樣的]
設計WEB頁面的時候 也應該遵守這個原則
 
2:談Ajax的Get和Post的區別
Get方式:

用get方式可傳送簡單資料,但大小一般限制在1KB下,資料追加到url中傳送(http的header傳送),也就是說,瀏覽器將各個表單欄位元素及其資料按照URL引數的格式附加在請求行中的資源路徑後面。另外最重要的一點是,它會被客戶端的瀏覽器快取起來,那麼,別人就可以從瀏覽器的歷史記錄中,讀取到此客戶的資料,比如帳號和密碼等。因此,在某些情況下,get方法會帶來嚴重的安全性問題。
 
Post方式:
當使用POST方式時,瀏覽器把各表單欄位元素及其資料作為HTTP訊息的實體內容傳送給Web伺服器,而不是作為URL地址的引數進行傳遞,使用POST方式傳遞的資料量要比使用GET方式傳送的資料量大的多。
 總之,GET方式傳送資料量小,處理效率高,安全性低,會被快取,而POST反之。
 
使用get方式需要注意:
1 對於get請求(或凡涉及到url傳遞引數的),被傳遞的引數都要先經encodeURIComponent方法處理。
例:var url = "update.php?username=" +encodeURIComponent(username) + "&content=" +encodeURIComponent(content)+"&id=1" ;
 
使用Post方式需注意:
1.設定header的Context-Type為application/x-www-form-urlencode確保伺服器知道實體中有引數變數. 通常使用XmlHttpRequest物件的SetRequestHeader("Context-Type","application/x-www- form-urlencoded;")。
例:xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
2.引數是名/值一一對應的鍵值對,每對值用&號隔開.如 var name=abc&sex=man&age=18,注意var name=update.php?abc&sex=man&age=18以及var name=?abc&sex=man&age=18的寫法都是錯誤的;
3.引數在Send(引數)方法中傳送,例: xmlHttp.send(name); 如果是get方式,直接 xmlHttp.send(null);
4.伺服器端請求引數區分Get與Post。如果是get方式則$username = $_GET["username"]; 如果是post方式,則$username = $_POST["username"];
 
AJAX亂碼問題
產生亂碼的原因:

1、xtmlhttp 返回的資料預設的字元編碼是utf-8,如果客戶端頁面是gb2312或者其它編碼資料就會產生亂碼
2、post方法提交資料預設的字元編碼是utf-8,如果伺服器端是gb2312或其他編碼資料就會產生亂碼
 
解決辦法有:
1、若客戶端是gb2312編碼,則在伺服器指定輸出流編碼
2、伺服器端和客戶端都使用utf-8編碼
 
gb2312:header('Content-Type:text/html;charset=GB2312');
utf8:header('Content-Type:text/html;charset=utf-8');
 
注意:如果你已經按上面的方法做了,還是返回亂碼的話,檢查你的方式是否為get,對於get請求(或凡涉及到url傳遞引數的),被傳遞的引數都要先經 encodeURIComponent方法處理.如果沒有用encodeURIComponent處理的話,也會產生亂碼.


$.ajax不快取版:
$.ajax({
             type:"GET"
    url:'test.html',
    cache:false,
    dataType:"html",
    success:function(msg){
        alert(msg);
    }
       });

jQuery.ajax( options ) : 通過 HTTP 請求載入遠端資料 
這個是jQuery 的底層 AJAX 實現。簡單易用的高層實現見 $.get, $.post 等。 
$.ajax() 返回其建立的 XMLHttpRequest 物件。大多數情況下你無需直接操作該物件,但特殊情況下可用於手動終止請求。 


注意: 如果你指定了 dataType 選項,請確保伺服器返回正確的 MIME 資訊,(如 xml 返回 "text/xml")。錯誤的 MIME 型別可能導致不可預知的錯誤。見 Specifying the Data Type for AJAX Requests 。 


當設定 datatype 型別為 'script' 的時候,所有的遠端(不在同一個域中)POST請求都回轉換為GET方式。 
$.ajax() 只有一個引數:引數 key/value 物件,包含各配置及回撥函式資訊。詳細引數選項見下。 


jQuery 1.2 中,您可以跨域載入 JSON 資料,使用時需將資料型別設定為 JSONP。使用 JSONP 形式呼叫函式時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函式名,以執行回撥函式。資料型別設定為 "jsonp" 時,jQuery 將自動呼叫回撥函式。(這個我不是很懂) 


引數列表: 
名 型別 描述 
url  String (預設: 當前頁地址) 傳送請求的地址。 
type String (預設: "GET") 請求方式 ("POST" 或 "GET"), 預設為 "GET"。注意:其它 HTTP 請求方法,如 PUT 和 DELETE 也可以使用,但僅部分瀏覽器支援。 
timeout Number 設定請求超時時間(毫秒)。此設定將覆蓋全域性設定。 
async  Boolean (預設: true) 預設設定下,所有請求均為非同步請求。如果需要傳送同步請求,請將此選項設定為 false。注意,同步請求將鎖住瀏覽器,使用者其它操作必須等待請求完成才可以執行。 
beforeSend  Function 傳送請求前可修改 XMLHttpRequest 物件的函式,如新增自定義 HTTP 頭。XMLHttpRequest 物件是唯一的引數。
 
function (XMLHttpRequest) {
 this; // the options for this ajax request

cache  Boolean (預設: true) jQuery 1.2 新功能,設定為 false 將不會從瀏覽器快取中載入請求資訊。 
complete  Function 請求完成後回撥函式 (請求成功或失敗時均呼叫)。引數: XMLHttpRequest 物件,成功資訊字串。
 
function (XMLHttpRequest, textStatus) {
 this; // the options for this ajax request

contentType  String (預設: "application/x-www-form-urlencoded") 傳送資訊至伺服器時內容編碼型別。預設值適合大多數應用場合。 
data  Object,
String 傳送到伺服器的資料。將自動轉換為請求字串格式。GET 請求中將附加在 URL 後。檢視 processData 選項說明以禁止此自動轉換。必須為 Key/Value 格式。如果為陣列,jQuery 將自動為不同值對應同一個名稱。如 {foo:["bar1", "bar2"]} 轉換為 '&foo=bar1&foo=bar2'。 
dataType  String 預期伺服器返回的資料型別。如果不指定,jQuery 將自動根據 HTTP 包 MIME 資訊返回 responseXML 或 responseText,並作為回撥函式引數傳遞,可用值:
 
"xml": 返回 XML 文件,可用 jQuery 處理。
"html": 返回純文字 HTML 資訊;包含 script 元素。
"script": 返回純文字 JavaScript 程式碼。不會自動快取結果。
"json": 返回 JSON 資料 。
"jsonp": JSONP 格式。使用 JSONP 形式呼叫函式時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函式名,以執行回撥函式。
error  Function (預設: 自動判斷 (xml 或 html)) 請求失敗時將呼叫此方法。這個方法有三個引數:XMLHttpRequest 物件,錯誤資訊,(可能)捕獲的錯誤物件。
function (XMLHttpRequest, textStatus, errorThrown) {
 // 通常情況下textStatus和errorThown只有其中一個有值 
 this; // the options for this ajax request

global  Boolean (預設: true) 是否觸發全域性 AJAX 事件。設定為 false 將不會觸發全域性 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用於控制不同的Ajax事件 
ifModified  Boolean (預設: false) 僅在伺服器資料改變時獲取新資料。使用 HTTP 包 Last-Modified 頭資訊判斷。 
processData  Boolean (預設: true) 預設情況下,傳送的資料將被轉換為物件(技術上講並非字串) 以配合預設內容型別 "application/x-www-form-urlencoded"。如果要傳送 DOM 樹資訊或其它不希望轉換的資訊,請設定為 false。 
success  Function 請求成功後回撥函式。這個方法有兩個引數:伺服器返回資料,返回狀態
function (data, textStatus) {
 // data could be xmlDoc, jsonObj, html, text, etc...
 this; // the options for this ajax request



這裡有幾個Ajax事件引數:beforeSend ,success ,complete ,error 。我們可以定義這些事件來很好的處理我們的每一次的Ajax請求。注意一下,這些Ajax事件裡面的 this 都是指向Ajax請求的選項資訊的(請參考說 get() 方法時的this的圖片)。 
請認真閱讀上面的引數列表,如果你要用jQuery來進行Ajax開發,那麼這些引數你都必需熟知的。 


示例程式碼,獲取部落格園首頁的文章題目: 
程式碼如下:
$.ajax({ 
type: "get", 
url: "http://www.cnblogs.com/rss", 
beforeSend: function(XMLHttpRequest){ 
//ShowLoading(); 
}, 
success: function(data, textStatus){ 
$(".ajax.ajaxResult").html(""); 
$("item",data).each(function(i, domEle){ 
$(".ajax.ajaxResult").append("<li>"+$(domEle).children("title").text()+"</li>"); 
}); 
}, 
complete: function(XMLHttpRequest, textStatus){ 
//HideLoading(); 
}, 
error: function(){ 
//請求出錯處理 

});
jQuery.ajaxSetup( options ) : 設定全域性 AJAX 預設選項。 
設定 AJAX 請求預設地址為 "/xmlhttp/",禁止觸發全域性 AJAX 事件,用 POST 代替預設 GET 方法。其後的 AJAX 請求不再設定任何選項引數。 


jQuery 程式碼: 
$.ajaxSetup({ 
url: "/xmlhttp/", 
global: false, 
type: "POST" 
}); 
$.ajax({ data: myData }); 

serialize() 與 serializeArray() 
serialize() : 序列表表格內容為字串。 
serializeArray() : 序列化表格元素 (類似 '.serialize()' 方法) 返回 JSON 資料結構資料。 

示例: 
HTML程式碼: 

<p id="results"><b>Results: </b> </p> 
<form> 
<select name="single"> 
<option>Single</option> 
<option>Single2</option> 
</select> 
<select name="multiple" multiple="multiple"> 
<option selected="selected">Multiple</option> 
<option>Multiple2</option> 
<option selected="selected">Multiple3</option> 
</select><br/> 
<input type="checkbox" name="check" value="check1"/> check1 
<input type="checkbox" name="check" value="check2" 
checked="checked"/> check2 
<input type="radio" name="radio" value="radio1" 
checked="checked"/> radio1 
<input type="radio" name="radio" value="radio2"/> radio2 
</form>
本文轉載自: http://www.jb51.net/article/44620.htm, 感謝您的分享。

相關文章