在jquery中使用AJAX
在jquery中使用封裝好的AJAX會對開發效率起到極大的便利,因此掌握jquery中的一系列AJAX封裝函數是做好頁面數據交互的必備技能;
1、在之前,我們首先需要詳細了解AJAX異步請求接受的五中響應消息,根據不同的響應類型進行不同的操作
(1)text/plain // 明文
服務器端:
header(‘Content-Type: text/plain‘);
echo ‘succ‘;
客戶端:
if(xhr.responseText===‘succ‘){ ... }
(2)text/html //html 片段
服務器端:
header(‘Content-Type: text/html‘);
echo "<tr><td>$data</td></tr>";
客戶端:
tbody.innerHTML = xhr.responseText
(3)application/javascript //javascript代碼片段
服務器端:
header(‘Content-Type: application/javascript‘);
echo "alert($data); f1(); f2($data)";
客戶端:
eval( xhr.responseText )
(4)application/xml //xml數據結構字符串
服務器端:
header(‘Content-Type: application/xml‘);
echo "<bookList><book>$b</book></bookList>";
客戶端:
var document = xhr.responseXML
(5)application/json //json 結構數據字符串
服務器端:
header(‘Content-Type: application/json‘);
//echo "[ {"bname":"","price":35.5},{} ]";
$list = ...;
echo json_encode($list);
客戶端:
var obj = JSON.parse( xhr.responseText )
2 、 jquery 中總共封裝了六個有關AJAX異步請求的函數 :
(1)、對象方法 ---load()
$(‘選擇器‘).load(URL, [請求數據], [成功後的回調函數])
$(‘ul‘).load(‘search_suggest.php‘);
向指定的URL發起異步請求;若有請求數據,就是POST請求,否則就是GET請求;獲取服務器端返回HTML片段響應,設置為當前選定元素的innerHTML。
(2)、全局函數 ---$.get()
$.get(URL, [請求數據], 響應成功後的回調函數)
向指定的URL發起異步的GET請求,把請求數據追加在URL的後面;服務器給出了成功的響應會自動調用第三個參數——doResponse。
提示:$.get會根據服務器端返回的響應消息內容類型自動決定如何處理,如applicatoin/json,會自動調用JSON.parse(xhr.responseText)進行解析!
(3)、全局函數---$.post()
$.post(URL, 請求數據, 響應成功後的回調函數)
基本上同$.get() 不同的是 請求類型為POST 而且會自動設置請求頭的 content-type 為 application/x-www-form-urlencode;
(4)、$.getScript() 向指定的URL發起異步的GET請求,把請求數據放置在url後面;服務器給出了成功的響應會自動執行eval( xhr.responseText )。
要求服務器必須返回application/javascript!即使不是,也會強制調用eval(xhr.responseText)進行執行!而$.get()可以實現同樣的功能,卻可以根據服務器端的響應頭來決定是否調用eval()
(5)、 $.getJSON() 指定的URL發起異步的GET請求,把請求數據放置在url後面;服務器給出了成功的響應會自動執行JSON.parse( xhr.responseText )。
要求服務器必須返回application/json!即使不是,也會強制調用JSON.parse(xhr.responseText)進行執行!而$.get()可以實現同樣的功能,卻可以根據服務器端的響應頭來決定是否調用JSON.parse()
上述五個函數的通病:只能處理成功的響應消息!如果服務器端返回了錯誤的響應消息(如404)上述五個函數不會有任何的提示——沒有相關的回調函數!
(6)、$.ajax() jquery中所有的異步請求都推薦使用 $.ajax()函數來完成
$.ajax()函數接收一個眾多參數組成的對象,可以指定
成功的調用: beforeSend() => success() => complete()
失敗的調用: beforeSend() => error() => complete()
$.ajax( {
type: ‘GET‘, //POST/PUT/DELETE...
url: ‘x.php‘,
data: ‘k=v&k=v‘, //{k:v, k:v}
beforeSend: fn, //在請求發送前的回調
success: fn, //響應成功後的回調
error: fn, //響應失敗後的回調
complete: fn //響應完成後(不論成敗)的回調
} )
對應於原生AJAX:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState===4){
if(xhr.status===200){
success();
}else {
error();
}
complete()
}
}
xhr.open()
beforeSend();
xhr.send()
上面僅僅列舉了$.ajax()方法的幾個常用的參數,還有更多的參數請查看手冊
案例演示 jquery中的$.ajax方法使用
實現效果如下圖:
(1)、實現 li 的 onmouserover 事件 請求該類別下的所有車輛信息
(2)、實現 列表下的div 的 click 事件 請求車輛詳細信息
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>...</title> <style> *{ padding:0; margin:0; } .container{ width:900px; } .container ul{ overflow:hidden; list-style:none; width:100% } .container ul li{ text-align:center; border-bottom: 1px solid #eee; float:left; line-height:30px; width:185px; padding:0 20px; } .container ul li:hover{ border-bottom:1px solid red; } #carList { width:100% overflow:hidden; height:325px; } #carList div { float:left; padding-top:25px; width:300px; } #carList>div:hover{ cursor:pointer; } #carList div b { padding-left:20px; } #carList div p{ line-height:35px; padding-left:20px; } #carList div p span { color:red; } #carShow{ margin-top:85px; overflow:hidden; } #carShow img{ float:left; } #carShow>div{ float:left; padding-left:175px; } #carShow p{ font-size:1.5em; line-height:35px; } #carShow p span{ color:red; } #carShow.hide{ display:none; } </style> </head> <body> <h1>車輛查詢系統</h1> <hr> <div class="container"> <ul id="uList"> <li data-value="LT8">8萬以下</li> <li data-value="LT15">8-15萬</li> <li data-value="LT30">15-30萬</li> <li data-value="SUV">SUV</li> </ul> <div id="carList"> </div> <div id="carShow" class="hide"> </div> </div> <script type="text/javascript" src="js/jquery-1.11.3.js"></script> <script type="text/javascript"> $("#uList").on("mouseover","li",function(e){ var $v = $(this).attr("data-value"); //console.log($v); $.ajax({ url:"car_list.php", data:{"type":$v}, success:function(obj){ html=""; for(var i =0; i<obj.length;i++){ var c = obj[i]; html+=`<div data-select=‘${c.cid}‘> <b>${c.cname}</b> <p>有 <span>${c.count}</span> 正在購買 </p> <img src=‘${c.pic}‘></img> </div>`; } $("#carList").html(html); } }); }) $("#carList").on("click","div",function(){ var $v = $(this).attr("data-select"); console.log($v); $.ajax({ url:"car_select.php", data:{"cid":$v}, success:function(obj){ $("#carShow").removeClass("hide").html( `<img src=‘${obj.pic}‘ > <div> <p>汽車編號:${obj.cid}</p> <p> <b>${obj.cname}</b> </p> <p> <span>¥${obj.price}</span> </p> <p>有 <span>${obj.count}</span> 人正在購買</p> </div>`); } }); }) </script> </body> </html>
(3)、響應頁面以php為例 -------數據傳輸格式為JSON
<?php //init 文件 $conn = mysqli_connect(‘127.0.0.1‘,‘root‘,‘‘,‘huimaiche‘,3306); $sql = ‘SET NAMES UTF8‘; mysqli_query($conn,$sql);
<?php // li onmouserover 事件的響應 header(‘Content-Type:application/json;charset=UTF-8‘); @$tid = $_REQUEST[‘type‘] or die(‘{"msg":"type required"}‘); require(‘car_init.php‘); $sql = "SELECT * FROM car WHERE type=‘$tid‘"; $result = mysqli_query($conn,$sql); $list = mysqli_fetch_all($result,MYSQLI_ASSOC); echo json_encode($list);
<?php // div click事件 的響應 header(‘Content-Type:application/json;charset=UTF-8‘); @$cid = $_REQUEST[‘cid‘] or die(‘{"msg":"cid required"}‘); require(‘car_init.php‘); $sql = "SELECT * FROM car WHERE cid=‘$cid‘"; $result = mysqli_query($conn,$sql); $row = mysqli_fetch_assoc($result); //var_dump($row); echo json_encode($row);
在jquery中使用AJAX