~ Ajax(jQuery)的相关 API
load()
load 方法的作用是从服务器中加载数据,是一个简单但强大的 Ajax 方法。
// 调用格式 load(url,[data],[callback]) // 其中,参数url为加载服务器地址, // 可选项data参数为请求时发送的数据, // callback参数为数据请求成功后,执行的回调函数
[1] Ajax 如何加载别的页面?
$('#result').load('ajax/test.html'); // 如果选择器没有匹配的元素,如document不包含id="result"的元素,这个Ajax请求将不会被发送出去<!-- 当前页面--> <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script> <style> h6{margin:4px;} p{margin: 0;} </style> <body> <input type="button" id="send" value="ajax获取"> <div class="comment">已有评论:</div> <div id="resText"></div> <script> $(function(){ $('#send').click(function(){ $('#resText').load('ajaxjQueryLoad.html') }) }) </script> <!-- 要载入的页面 --> <div class="comment"> <h6>张三:</h6> <p class="para">沙发.</p> </div> <div class="comment"> <h6>李四:</h6> <p class="para">板凳.</p> </div> <div class="comment"> <h6>王五:</h6> <p class="para">地板.</p> </div>
[2] 如何加载页面的一部分呢? — 如果url参数的字符串中包含一个或多个空格,那么第一个空格后面的内容,会被当成是jQuery的选择器,从而决定应该加载返回结果中的哪部分内容。
$('#result').load('ajax/test.html #container');当这种方法执行, 它将检索ajax/test.html返回的页面内容,jQuery会获取ID为container元素的内容,并且插入到ID为result元素,而其他未被检索到的元素将被废弃。
$(function(){ $('#send').click(function(){ $('#resText').load('ajaxjQueryLoad.html .para') }) })
[ 传递方式 ] load()方法默认使用GET方式,如果data参数提供一个对象,那么使用POST方式。
//无参数传递,则是GET方式 $('#resText').load('tset.php') //有参数传递,则是POST方式 $('#resText').load('tset.php',{name:'rain',age:'22'})
[ 回调函数 ] 如果提供了"complete"回调函数,它将在函数处理完之后,并且HTML已经被插入完时被调用。回调函数会在每个匹配的元素上被调用一次,并且this始终指向当前正在处理的DOM元素。
回调函数有3个参数,分别代表请求返回的内容、请求状态和XMLHTTPRequest对象。
$('#result').load('ajax/test.html',function(responseText,textStatus,XMLHTTPRequest) { //responseText :请求返回的内容 //testStatus: success、error、notmodified、timeout四种 //XMLHTTPRequest: XMLHTTPRequest对象 });<style> h6{margin:4px;} p{margin: 0;} #test{border:1px solid black;} </style> <input type="button" id="send" value="ajax获取"> <div class="comment">已有评论:</div> <div id="resText"></div> <div id="test"></div> <script> $(function(){ $('#send').click(function(){ $('#resText').load('ajaxjQueryLoad.html .para',function(a,b,c){ $('#test').html('responseText:' + a + '<br>textStatus:' + b + '<br>XMLHTTPRequest:' + c); }) }) }) </script>
getJSON()
getJSON()方法使用一个HTTP GET请求从服务器加载JSON编码的数据。
// 调用格式 $.getJSON(url,[data],[callback]) getJSON()方法相当于以下ajax()方法的缩写: $.ajax({ dataType: "json", url: url, data: data, success: success });[ 回调函数 ] 回调函数中的第一个参数表示返回的数据
$.getJSON('test.json',function(data){ //data :返回的数据 })
一般地,使用each()方法,来构建DOM结构
<input id="btnShow" type="button" value="加载" />
<div id="result"></div>
<script>
$('#btnShow').click(function(){
var $this = $(this);
var $html = '';
$.getJSON('sport.json',function(data){
$this.attr('disabled','true');
$.each(data,function(index,sport){
$html += '<div>' + sport["name"] + '</div>';
});
$('#result').html($html);
})
})
</script>
// json文件
[{
"name": "足球"
},{
"name": "散步"
},{
"name": "篮球"
},{
"name": "乒乓球"
},{
"name": "骑自行车"
}]
getScript()
getScript()方法使用一个HTTP GET请求从服务器加载并执行一个javascript文件
// 调用格式 $.getScript(url,[callback]) 相当于一个Ajax函数的缩写: $.ajax({ url: url, dataType: "script", success: success });
<input id="btnShow" type="button" value="加载" />
<div id="result"></div>
<script>
$('#btnShow').click(function(){
var $this = $(this);
$.getScript('sport.js',function(){
$this.attr('disabled','true');
$('#result').html($html);
})
})
</script>
var data = [{
"name": "足球"
}, {
"name": "散步"
}, {
"name": "篮球"
}, {
"name": "乒乓球"
}, {
"name": "骑自行车"
}];
var $html = '';
$.each(data, function (index, sport) {
$html += "<div>" + sport["name"] + "</div>";
});
get()
get()方法使用一个HTTP GET请求从服务器加载数据。
[ 调用格式 ] get()方法的调用格式如下所示,url表示一个包含发送请求的URL字符串;data表示发送给服务器的字符串或Key/value键值对;success(data, textStatus, jqXHR)表示当请求成功后执行的回调函数;dataType表示从服务器返回的预期的数据类型。默认:智能猜测(xml, json, script, 或 html)。
jQuery.get( url [, data ] [, success(data, textStatus, jqXHR) ] [, dataType ] )
相当于一个ajax功能的缩写
$.ajax({
url: url,
data: data,
success: success,
dataType: dataType
});
[ 使用参数 ] 通过get()方法发送给服务器的key/value数据会作为查询字符串最终附加到URL中
<form action="#" id="form1">
<p>评论:</p>
<p>姓名:<input type="text" name="username" id="username"></p>
<p>内容:<textarea name="content" id="content" rows="2" cols="20"></textarea></p>
<p><input type="button" id="send" value="提交"></p>
</form>
<div class="comment">已有评论:
<div id="resText"></div>
</div>
<script>
$('#send').click(function(){
$.get('jqGet.php',{
username:$('#username').val(),
content:$('#content').val()
},function(data){
//
})
})
</script>
[ 回调函数 ]
function(data,textStatus){
//data: 返回的内容,可能是XML、JSON、HTML、JS
//textStatus: success、error、notmodified、timeout四种
}
[ 数据格式 ]
1、HTML片段
function(data,textStatus){
$('#resText').html(data);
}
2、XML文档
function(data,textStatus){
var username = $(data).find('comment').attr('username');
var content = $(data).find('comment content').text();
var txtHtml = "<div class='comment'><h6>" + username + ":</h6><p class='para'>" + content + "</p></div>";
$('#resText').html(txtHtml);
}
3、JSON
function(data,textStatus){
var username = data.username;
var content = data.content;
var txtHtml = "<div class='comment'><h6>" + username + ":</h6><p class='para'>" + content + "</p></div>";
$('#resText').html(txtHtml);
}
<!-- 前端页面 -->
<select id="num">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<button id="send">测试</button>
<div id="result"></div>
<script>
$('#send').click(function(){
$.get('jqRequest.php',{
num: $('#num').val()
},function(data){
$('#result').html('您选择的数字' + $('#num').val() + '是' + data)
})
})
</script>
<!-- 后端页面 -->
<?php
$num = $_REQUEST['num'];
if($num % 2 == 0){
echo '偶数';
}else{
echo '奇数';
}
?>
post()
post()方法使用一个HTTP POST 请求从服务器加载数据
jQuery.post( url [, data ] [, success(data, textStatus, jqXHR) ] [, dataType ] )
相当于一个 Ajax 函数的简写形式
$.ajax({
type: "POST",
url: url,
data: data,
success: success,
dataType: dataType
});
<!-- 前端页面 -->
<select id="num">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<button id="send">测试</button>
<div id="result"></div>
<script>
$('#send').click(function(){
$.post('jqRequest.php',{
num: $('#num').val()
},function(data){
$('#result').html('您选择的数字' + $('#num').val() + '是' + data)
})
})
</script>
<!-- 后端页面 -->
<?php
$num = $_REQUEST['num'];
if($num % 2 == 0){
echo '偶数';
}else{
echo '奇数';
}
?>
post()和get()的结构和使用方式都相同。但要注意的是,当load()方法带有数据参数传递时,会使用POST方式发送请求。
序列化
当一个表单中字段较多,表单元素较复杂时,就需要一种方法来简化提取表单内部控件的值的操作,这一行为通常叫序列化,jQuery提供了param()、serialize()和serialzeArray()这三个方法。
[ param() ] param(obj)方法用来创建一个数组或对象序列化的字符串,适用于一个URL地址查询字符串或Ajax请求。
console.log($.param({ width:1680, height:1050 }));//'width=1680&height=1050'
[ serialize() ] serialize()方法将用作提交的表单元素的值编译成字符串
// serialize()方法的一个额外好处是会自动对键值对儿中的特殊字符进行编码
<form>
<select name="single">
<option>Single</option>
<option>Single2</option>
</select>
<br />
<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" id="ch1"/>
<label for="ch1">check1</label>
<input type="checkbox" name="check" value="check2" checked="checked" id="ch2"/>
<label for="ch2">check2</label>
<br />
<input type="radio" name="radio" value="radio1" checked="checked" id="r1"/>
<label for="r1">radio1</label>
<input type="radio" name="radio" value="radio2" id="r2"/>
<label for="r2">radio2</label>
</form>
<p><tt id="results"></tt></p>
<script>
function showValues() {
$("#results").text($("form").serialize());
}
$(":checkbox, :radio").click(showValues);
$("select").change(showValues);
showValues();
</script>
[ serializeArray() ] serializeArray()方法将用作提交的表单元素的值编译成拥有name和value对象组成的数组,即json格式的数据。例如[ { name: a value: 1 }, { name: b value: 2 },...]。
<form>
<div><input type="text" name="a" value="1" id="a" /></div>
<div><input type="text" name="b" value="2" id="b" /></div>
<div><input type="hidden" name="c" value="3" id="c" /></div>
<div>
<textarea name="d" rows="8" cols="40">4</textarea>
</div>
<div><select name="e">
<option value="5" selected="selected">5</option>
<option value="6">6</option>
<option value="7">7</option>
</select></div>
<div>
<input type="checkbox" name="f" value="8" id="f" />
</div>
<div>
<input type="submit" name="g" value="Submit" id="g" />
</div>
</form>
<script>
$('form').submit(function() {
console.log($(this).serializeArray());
return false;
});
</script>
// 结果为:
[
{
name: "a",
value: "1"
},
{
name: "b",
value: "2"
},
{
name: "c",
value: "3"
},
{
name: "d",
value: "4"
},
{
name: "e",
value: "5"
}
]
该对象可以使用each()函数对数据进行迭代输出
$dataArr = $('form').serializeArray();
$html = '';
$.each($dataArr,function(i,data){
$html += data.name + ':' + data.value + ';';
})
console.log($html);//a:1;b:2;c:3;d:4;e:5;
全局事件
jQuery简化ajax操作不仅体现在调用ajax方法和处理响应方面,而且还体现在对调用ajax方法的过程中的HTTP请求的控制。通过jQuery提供的一些自定义全局函数,能够为各种与ajax相关的事件注册回调函数。例如,当ajax请求开始时,会触发ajaxStart()方法的回调函数;当ajax请求结束时,会触发ajaxStop()的回调函数。这些方法都是全局的方法,因此无论创建它们的代码位于何处,只要有ajax请求发生,就会触发它们。
[ ajaxSetup() ] ajaxSetup()方法为以后要用到的Ajax请求设置默认的值,设置完成后,后面的Ajax请求将不需要再添加这些选项值,它的调用格式为:
$.ajaxSetup([options])例如,设置 AJAX 请求默认地址为 "/xmlhttp/",用 POST 代替默认 GET 。其后的 AJAX 请求不再设置任何选项参数
$.ajaxSetup({ url: "/xmlhttp/", type: "POST" }); $.ajax({ data: myData });如果想让某个ajax请求不受ajaxSetup()方法的影响,可以在使用ajax()方法时,将参数中的global设置为false
$.ajaxSetup({ url: "/xmlhttp/", type: "POST" }); $.ajax({ global:false, url:"test", type:'GET' })
[ ajaxStart()和ajaxStop() ] ajaxStart()和ajaxStop()方法是绑定Ajax事件。ajaxStart()方法用于在Ajax请求发出前触发函数,ajaxStop()方法用于在Ajax请求完成后触发函数。它们的调用格式为:
$(selector).ajaxStart(function()) $(selector).ajaxStop(function())[注意]从 jQuery 1.8 开始, ajaxStart()和ajaxStop()方法只能绑定到 document元素
例如,读取远程网站的图片速度可能会比较慢,如果在加载的过程中,不给用户提供一些提示和反馈信息,很容易让用户误认为按钮单击无用,使用户对网站失去信心。这时,ajaxStart()和ajaxStop()方法就派上用场了。
<!-- 前端页面 --> <select id="num"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> </select> <button id="send">测试</button> <div id="result"></div> <script> $(document).ajaxStart(function(){ $('#test').show() }).ajaxStop(function(){ $('#test').hide(); }); $('#send').click(function(){ $.ajax({ url:'jqRequest.php', type:'POST', data:{ num:$('#num').val() }, success:function(data){ $('#result').html('您选择的数字' + $('#num').val() + '是' + data); } }) }) </script> <!-- 后端页面 --> <?php $num = $_REQUEST['num']; if($num % 2 == 0){ echo '偶数'; }else{ echo '奇数'; } ?>