jQuery中ajax的使用與緩衝問題的解決方案
來源:互聯網
上載者:User
本篇文章主要介紹了jQuery中ajax的使用與緩衝問題的解決方案。需要的朋友可以過來參考下,希望對大家有所協助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>