在Ajax课程中,我们了解了最基本的异步处理方式。本章,我们将了解一下Ajax的一些全局请求事件、跨域处理和其他一些问题。

加载请求

在Ajax异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的问题。而超过一定时间的请求,用户就会变得不再耐烦而关闭页面。而如果在请求期间能给用户一些提
示,比如:正在努力加载中...,那么相同的请求时间会让用户体验更加的好一些。

jQuery提供了两个全局事件.ajaxStart()和.ajaxStop()。这两个全局事件,只要用户触发了Ajax,请求开始时(未完成其他请求)激活.ajaxStart(),请求结束时(所有请求都结束了)激活.ajaxStop()。

Ajax进阶.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax进阶</title>
<script type="text/javascript" src="jquery-1.12.3.js"></script>
<script type="text/javascript" src="demo.js"></script>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<form>
用户名:<input type="text" name="user" />
邮 件:<input type="text" name="email" />
<input type="radio" name="sex" value="男" />男
<input type="radio" name="sex" value="女" />女
<input type="button" value="提交" />
</form>
<span class="loading">正在加载中...</span>
<div id="box"> </div>
</body>
</html>

style.css:

.loading {
display: none;
color: red;
font-weight: bold;
}

tomcat服务器端存在一个user.php,如下:

<?php
echo $_POST['user'].' - '.$_POST['email'];
?>

然后现在加载一个找不到的url,诸如:http://dsafsefre/user.php

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"http://dsafsefre/user.php",
data:$("form").serialize(),
success:function(response, status, xhr) {
$("#box").html(response);
}
});
});

请求加载提示的显示和隐藏(必须绑定在document元素上)

$(document).ajaxStart(function() {
$(".loading").show();
}).ajaxStop(function() {
$(".loading").hide();
});

如果请求时间太长,可以设置超时

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"http://dsafsefre/user.php",
data:$("form").serialize(),
success:function(response, status, xhr) {
$("#box").html(response);
},
timeout:500 //如果请求时间太长,可以设置超时
});
});

如果某个ajax不想触发全局事件,可以设置取消

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"http://dsafsefre/user.php",
data:$("form").serialize(),
success:function(response, status, xhr) {
$("#box").html(response);
},
timeout:500, //如果请求时间太长,可以设置超时
global:false
});
});

若global置为false,那么以下代码将不起作用:

$(document).ajaxStart(function() {
$(".loading").show();
}).ajaxStop(function() {
$(".loading").hide();
});

错误处理

Ajax异步提交时,不可能所有情况都是成功完成的,也有因为代码异步文件错误、网络错误导致提交失败的。这时,我们应该把错误报告出来,提醒用户重新提交或提示开发者
进行修补。

在之前高层封装中是没有回调错误处理的,比如$.get()、$.post()和.load(),所以早期的方法通过全局.ajaxError()事件方法来返回错误信息,而在jQuery1.5之后,可以通过连缀处理使用局部.error()方法即可,而对于$.ajax()方法,不但可以用这两种方法,还有自己的属性方法error : function () {}。

$.ajax()使用属性提示错误:

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"user1.php",
data:$("form").serialize(),
success:function(response, status, xhr) {
$("#box").html(response);
},
error:function(xhr, errorText, errorStatus) {
alert("错误!"); //错误!
alert(errorText+":"+errorStatus); //error:Not Found
alert(xhr.status+":"+xhr.statusText); //404:Not Found
}
});
});

$.post()使用连缀.error()方法提示错误,连缀方法将被.fail()取代

$("form input[type=button]").click(function() {
$.post("user1.php").error(function(xhr, errorText, errorType) {
alert("错误!"); //错误!
alert(errorText+":"+errorType); //error:Not Found
alert(xhr.status+":"+xhr.statusText); //404:Not Found
});
});

$.post()使用全局.ajaxError()事件提示错误

$("form input[type=button]").click(function() {
$.post("user1.php");
});
$(document).ajaxError(function(event, xhr, settings, infoError) {
//alert("错误!"); //错误!
//alert(event.type); //ajaxError
//alert(event.target); //[object HTMLDocument]
//for(var i in event) {
// document.write(i + "<br/>"); //打印事件对象的属性和方法
//} //alert(settings); //[object Object]
//for(var i in settings) {
// document.write(i + "<br/>");
//}
//alert(settings.url); //user1.php
//alert(settings.type); //post
alert(infoError); //Not Found
});

请求全局事件

jQuery对于Ajax操作提供了很多全局事件方法,.ajaxStart()、.ajaxStop()、.ajaxError()等事件方法。他们都属于请求时触发的全局事件,除了这些,还有一些其他全局事件:

.ajaxSuccess(),对应一个局部方法:.success(),请求成功完成时执行。

.ajaxComplete(),对应一个局部方法:.complete(),请求完成后注册一个回调函数。

.ajaxSend(),没有对应的局部方法,只有属性beforeSend,请求发送之前要绑定的函数。

先看看.ajaxSend()/.ajaxSuccess()/.ajaxError()/.ajaxComplete()的执行顺序:

以上代码除jQuery代码变化之外,其余均不变,jQuery代码如下:

$("form input[type=button]").click(function() {
$.post("user1.php"); //或$.post("user.php")
});
$(document).ajaxSend(function() {
alert("发送请求之前执行");
}).ajaxComplete(function() {
alert("请求完成后,不管是否失败成功都执行");
}).ajaxSuccess(function() {
alert("请求成功后执行");
}).ajaxError(function() {
alert("请求失败后执行");
});

注意:全局事件方法是所有Ajax请求都会触发到,并且只能绑定在document上,而局部方法,则针对某个Ajax。对于一些全局事件方法的参数,大部分为对象,而这些对象有哪些属性或方法能调用,可以通过遍历方法得到。

$.post()使用局部方法.success()、.complete()、.error()、beforeSend是局部属性,没有对应的局部方法beforeSend()。

$("form input[type=button]").click(function() {
$.post("user1.php", $("form").serialize()).success(function() {
alert("请求成功后执行");
}).complete(function() {
alert("请求完成后,不管是否失败成功都执行");
}).error(function() {
alert("请求失败后执行");
}).beforeSend(function() {
alert("发送请求之前执行"); //无效
});
});

$.ajax()方法,可以直接通过属性设置即可

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"user.php",
data:$("form").serialize(),
success:function(response, status, xhr) {
alert("请求成功后执行");
},
complete:function() {
alert("请求完成后,不管是否失败成功都执行");
},
beforeSend:function() {
alert("发送请求之前执行");
},
error:function() {
alert("请求失败后执行");
}
});
});

注意:在jQuery1.5版本以后,使用.success()、.error()和.complete()连缀的方法,可以用.done()、.fail()和.always()取代。

Ajax的进阶学习(一)的更多相关文章

  1. Ajax的进阶学习(二)

    JSON和JSONP 如果在同一个域下,$.ajax()方法只要设置dataType属性即可加载JSON文件.而在非同域下,可以使用JSONP,但也是有条件的. Ajax进阶.html: <!D ...

  2. PHP程序员进阶学习书籍参考指南

    PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18     [初阶](基础知识及入门)   01. <PHP与MySQL程序设计(第4版)> ...

  3. Matlab 进阶学习记录

    最近在看 Faster RCNN的Matlab code,发现很多matlab技巧,在此记录: 1. conf_proposal  =  proposal_config('image_means', ...

  4. zuul进阶学习(二)

    1. zuul进阶学习(二) 1.1. zuul对接apollo 1.1.1. Netflix Archaius 1.1.2. 定期拉 1.2. zuul生产管理实践 1.2.1. zuul网关参考部 ...

  5. ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - ROSMapModify - ROS地图修改

    ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - 2 - MapModify地图修改 We can use gmapping model to genera ...

  6. 状态保持以及AJAX的初步学习

    嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...

  7. Struts2进阶学习4

    Struts2进阶学习4 自定义拦截器的使用 核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <! ...

  8. Struts2进阶学习3

    Struts2进阶学习3 OGNL表达式与Struts2的整合 核心配置文件与页面 <?xml version="1.0" encoding="UTF-8" ...

  9. Java进阶学习:将文件上传到七牛云中

    Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...

随机推荐

  1. Tutorial: Analyzing sales data from Excel and an OData feed

    With Power BI Desktop, you can connect to all sorts of different data sources, then combine and shap ...

  2. Swift TabeleViewCell dequeueReusableCellWithIdentifier 使用的新的细节,原来现在可以这样

    今天在看官方的TableView Guide,突然想起来最近写的一个代码中实现tableViewCell复用的时候有点问题: var cell = UITableViewCell(style: UIT ...

  3. MVC模式中路由如何生成URL

    路由有必要的参数吗 在MVC设计模式中,一个比较重要的步骤是浏览器发送的请求如何生成相应的URL,交给服务器去实例化相应的控制器类然后调用相应的控制器类的对应方法,返回视图给用户.这个流程细说起来比较 ...

  4. mysql安装/启动报错汇总

    2016/9/6补充 初始化报错: # /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysq ...

  5. 新安装Ubuntu加载时提示“为/检查磁盘时发生严重错误”的解决方法

    本文部分内容转载自: http://jingyan.baidu.com/article/0aa22375bbffbe88cc0d6419.html http://www.aichengxu.com/v ...

  6. c++11并发程序设计(1)

    第一章:你好 c++的并发世界 1.何为并发 最简单和最基本的并发,是指两个或两个以上的独立活动同时进行. 对于单个处理单元或者核心,这种机器只能在某一时刻执行一个任务,不够它可以每秒进行多次的任务切 ...

  7. 字符串流sstream[part3/使用字符串流进行安全的类型转换]

    参考: http://blog.163.com/zhuandi_h/blog/static/180270288201291710222975/ http://www.cnblogs.com/games ...

  8. 项目部署之VPN+端口映射

    背景:出差开发项目,需要在客户那里部署基本成型的系统.这套系统需要一个公网的ip地址(一个后台管理系统,使用花生壳提供域名服务.一个公网的tcp server,java io实现),但是客户那里无法提 ...

  9. 理解CSS3里的Flex布局用法

    一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{ disp ...

  10. 【BZOJ】【TJOI2015】线性代数

    网络流/最小割/最大权闭合图 2333好开心,除了一开始把$500^2$算成25000……导致数组没开够RE了一发,可以算是一次AC~ 咳咳还是回归正题来说题解吧: 一拿到这道题,我就想:这是什么鬼玩 ...