jQuery Ajax【下】
2016-05-12 23:06
465 查看
学习要点:
1.加载请求
2.错误处理
3.请求全局事件
4.JSON 和 JSONP
5.jqXHR 对象
一、加载请求
当网速较慢的时候,我们的请求迟迟没有被响应
这时候,用户就会感到不耐烦,因此我们需要一些友好的提示
JQ提供了两个全局事件,startAjax和stopAjax分别在ajax发生和结束请求的时候触发
如果请求超时,我们可以设置超时的时间
首先我们来模拟一下,在ajax.php将响应时间加长
如果ajax不想触发全局事件,我们可以设置
二、错误处理
由于种种原因的限制,例如数据不存在或者网速的问题,我们的请求可能出来种种的问题,
这时我们就需要对错误进行处理,并且把他们表现出来
$.ajax()使用属性提示错误
$.post()方法使用连缀.error()方法
在这里,test.php本身是不存在的
同时我们可以用.ajaxError()全局事件来提示错误
三、请求全局事件
在前面我们介绍了ajaxStart()、ajaxStop()和ajaxError()这三个全局事件
其实还有全局事件我们没有介绍,这里我们来列举几个常用的
1.第一组.ajaxSuccess(),对应一个局部方法:.success(),请求成功完成时执行。
PS : 全局事件方法是所有 Ajax 请求都会触发到,并且只能绑定在 document 上。而局部方法,则针对某个 Ajax。
2.第二组:.ajaxComplete(),对应一个局部方法:.complete(),请求完成后注册一个回调函数。
局部方法.complete()
全局事件
3.第三组.ajaxSend(),没有对应的局部方法,只有属性 beforeSend,请求发送之前要绑定的函数。
ajax属性
全局事件
四、JSON与JSONP
如果在同一个域下,$.ajax()方法只要设置 dataType 属性即可加载 JSON 文件。
而在非同域下,可以使用 JSONP,但也是有条件的。
在同域下
如果想跨域操作文件的话,我们就必须使用 JSONP
跨域的 PHP 端文件
http://114.215.112.235/test.php
$.getJSON()方法跨越获取JSON文件
$.ajax()跨域获取JSON
五.jqXHR 对象
在之前我们使用的局部方法: .success()、.error()和.complete()方法,
使用的对象并非是XMLHttpRequest对象,而是jqXHR对象,
且我们推荐使用.done()、.fail()和.always()方法
使用 jqXHR 的连缀方式比$.ajax()的属性方式有三大好处:
1.可连缀操作,可读性大大提高;
2.可以多次执行同一个回调函数;
3.为多个操作指定回调函数;
多个操作指定回调函数
1.加载请求
2.错误处理
3.请求全局事件
4.JSON 和 JSONP
5.jqXHR 对象
一、加载请求
当网速较慢的时候,我们的请求迟迟没有被响应
这时候,用户就会感到不耐烦,因此我们需要一些友好的提示
JQ提供了两个全局事件,startAjax和stopAjax分别在ajax发生和结束请求的时候触发
// dome.html <div></div> // ajax.php <?php echo 111;?> $.ajax({ type : "get", url : "ajax.php", success : function (response, status, xhr) { alert(response); } }); $(document).ajaxStart(function () { $("div").html("数据加载中"); }); $(document).ajaxStop(function () { $("div").html("数据加载完毕"); });
如果请求超时,我们可以设置超时的时间
首先我们来模拟一下,在ajax.php将响应时间加长
<?php sleep(3000); echo 111; ?> $.ajax({ timeout : 2000, type : "get", url : "ajax.php", success : function (response, status, xhr) { alert(response); }, error : function (response, status, xhr) { alert("加载出错或者超时"); } }); $(document).ajaxStart(function () { $("div").html("数据加载中"); }); $(document).ajaxStop(function () { $("div").html("数据加载完毕"); });
如果ajax不想触发全局事件,我们可以设置
$.ajax({ global : false, // 这样ajaxStart和ajaxStop事件将不会触发了 type : "get", url : "ajax.php", success : function (response, status, xhr) { alert(response); } }); $(document).ajaxStart(function () { $("div").html("数据加载中"); }); $(document).ajaxStop(function () { $("div").html("数据加载完毕"); });
二、错误处理
由于种种原因的限制,例如数据不存在或者网速的问题,我们的请求可能出来种种的问题,
这时我们就需要对错误进行处理,并且把他们表现出来
$.ajax()使用属性提示错误
$.ajax({ timeout : 2000, type : "get", url : "ajax.php", success : function (response, status, xhr) { alert(response); }, error : function (xhr, errorText, errorStatus) { alert(xhr.status + " : " + xhr.errorText); // 0 : undefined } }); $(document).ajaxStart(function () { $("div").html("数据加载中"); }); $(document).ajaxStop(function () { $("div").html("数据加载完毕"); });
$.post()方法使用连缀.error()方法
在这里,test.php本身是不存在的
$.post("test.php").error(function (xhr, status, info) { alert(xhr.status + " : " + xhr.errorText); // 404 : undefined alert(status + " : " + info); // error : Not Found });
同时我们可以用.ajaxError()全局事件来提示错误
$(document).ajaxError(function (event, xhr, settings, infoError) { alert(xhr.status + " : " + xhr.errorText); // 0 : undefined alert(settings + " : " + infoError); // [object Object] : timeout }); $.ajax({ timeout : 2000, type : "get", url : "ajax.php", success : function (response, status, xhr) { alert(response); } });
三、请求全局事件
在前面我们介绍了ajaxStart()、ajaxStop()和ajaxError()这三个全局事件
其实还有全局事件我们没有介绍,这里我们来列举几个常用的
1.第一组.ajaxSuccess(),对应一个局部方法:.success(),请求成功完成时执行。
<?php echo 111; ?> // 局部方法.success() $.ajax({ type : "get", url : "ajax.php" }).success(function (response, status, xhr) { alert(response); // 111 }); // 全局事件 $(document).ajaxSuccess(function (event, xhr, settings) { alert(xhr.responseText); // 111 }); $.ajax({ type : "get", url : "ajax.php" });
PS : 全局事件方法是所有 Ajax 请求都会触发到,并且只能绑定在 document 上。而局部方法,则针对某个 Ajax。
2.第二组:.ajaxComplete(),对应一个局部方法:.complete(),请求完成后注册一个回调函数。
局部方法.complete()
$.ajax({ type : "get", url : "ajax.php" }).complete(function (response, status, xhr) { alert("complete"); // complete });
全局事件
$(document).ajaxComplete(function (event, xhr, settings) { // 遍历setteings for (var s in settings) { console.log(s + " : " + settings[s]); // isLocal : false ... }; }); $.ajax({ type : "get", url : "ajax.php" });
3.第三组.ajaxSend(),没有对应的局部方法,只有属性 beforeSend,请求发送之前要绑定的函数。
ajax属性
$.ajax({ type : "get", url : "ajax.php", beforeSend : function (xhr, settings) { alert("在发送之前的属性"); // 在发送之前的属性 } });
全局事件
$(document).ajaxSend(function (event, xhr, settings) { alert("数据发送之前"); // 数据发送之前 }); $.ajax({ type : "get", url : "ajax.php" });
四、JSON与JSONP
如果在同一个域下,$.ajax()方法只要设置 dataType 属性即可加载 JSON 文件。
而在非同域下,可以使用 JSONP,但也是有条件的。
在同域下
// ajax.json {"name" : "zhang", "age" : 23} $.ajax({ type : "post", url : "ajax.json", dataType : "json", success : function (response, status, xhr) { for (var i in response) { alert(i + " : " + response[i]); // name : zhang ... } } });
如果想跨域操作文件的话,我们就必须使用 JSONP
跨域的 PHP 端文件
http://114.215.112.235/test.php
<?php $arr = array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); $result = json_encode($arr); $callback = $_GET['callback']; echo $callback."($result)"; ?>
$.getJSON()方法跨越获取JSON文件
$.getJSON("http://114.215.112.235/test.php?callback=?", function (response) { console.log(response); });
$.ajax()跨域获取JSON
$.ajax({ url : 'http://114.215.112.235/test.php?callback=?', dataType : "jsonp", success : function (response, status, xhr) { console(response); alert(response.a); } });
五.jqXHR 对象
在之前我们使用的局部方法: .success()、.error()和.complete()方法,
使用的对象并非是XMLHttpRequest对象,而是jqXHR对象,
且我们推荐使用.done()、.fail()和.always()方法
var jqXHR = $.ajax({ url : "ajax.php", type : "get" }); for (var i in jqXHR) { console.log(i + " : " + jqXHR[i]); // readyState : 1 .... } jqXHR.done(function (response) { alert(response); // lll });
使用 jqXHR 的连缀方式比$.ajax()的属性方式有三大好处:
1.可连缀操作,可读性大大提高;
2.可以多次执行同一个回调函数;
3.为多个操作指定回调函数;
多个操作指定回调函数
// test1.php 和 test2.php <?php echo "I am test1.php";?> <?php echo "I am test2.php";?> var jqXHR = $.ajax("test1.php"); var jqXHR2 = $.ajax("test2.php"); $.when(jqXHR, jqXHR2).done(function (r1, r2) { // 遍历两个jqXHR对象 for(var v1 in r1) { console.log(v1 + " : " + r1[v1]); //0 : I am test1.php .... } for(var v2 in r2) { console.log(v2 + " : " + r2[v2]); //0 : I am test2.php .... } })
相关文章推荐
- Jquery ajax post
- jQuery实现焦点图[兼容ie7+]
- jQuery
- jquery 中如何将数组转化为json字符串,然后再转化回来?
- Jquery即点即改2
- jquery事件委托
- jquery中$.ajax的$.get与$.post使用
- jquery之音乐均衡器
- jQuery编程的最佳实践
- Jquery判断$("#id")获取的对象是否存在的方法
- jQuery(1)--入口模块jQuery()
- jquery mobile上传图片完整例子(包含ios图片横向问题处理和C#后台图片压缩)
- jquery中的事件
- 图片跟随鼠标移动(jquery)
- jQuery关于mouseover和mouseenter的区别
- jquery修改display属性
- 第26篇 jQuery 快速学习下
- jQuery 获取 checkbox、select、radio值
- ECSHOP用Jquery的getJSON实现两网站之间跨域读取
- jquery 获取属性的值