Ajax 进阶
学习要点:
1.加载请求
2.错误处理
3.请求全局事件
4.JSON 和 JSONP
5.jqXHR 对象

一.加载请求

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

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

//请求加载提示的显示和隐藏
$('.loading').ajaxStart(function () {
  $(this).show();
  }).ajaxStop(function () {
  $(this).hide();
});
注意:以上代码在 jQuery1.8 及以后的版本不在有效,需要使用 jquery-migrate 向下兼容才能运行。新版本中,必须绑定在 document 元素上。
$(document).ajaxStart(function () {
  $('.loading').show();
  }).ajaxStop(function () {
  $('.loading').hide();
});
//如果请求时间太长,可以设置超时
$.ajax({
  timeout : 500    /*超时时间*/
});
//如果某个 ajax 不想触发全局事件,可以设置取消
$.ajax({
  global : false
});
二.错误处理
Ajax 异步提交时,不可能所有情况都是成功完成的,也有因为代码异步文件错误、网络错误导致提交失败的。这时,我们应该把错误报告出来,提醒用户重新提交或提示开发者

进行修补。
在之前高层封装中是没有回调错误处理的,比如$.get()、$.post()和.load()。所以,早期
的方法通过全局.ajaxError()事件方法来返回错误信息。而在 jQuery1.5 之后,可以通过连缀
处理使用局部.error()方法即可。而对于$.ajax()方法,不但可以用这两种方法,还有自己的属
性方法 error : function () {}。
//$.ajax()使用属性提示错误
$.ajax({
  type : 'POST',
  url : 'test1.php',
  data : $('form').serialize(),
  success : function (response, status, xhr) {
    $('#box').html(response);
  },
  error : function (xhr, errorText, errorStatus) {
    alert(xhr.status + ':' + xhr.statusText);
  }
});
//$.post()使用连缀.error()方法提示错误,连缀方法将被.fail()取代
$.post('test1.php').error(function (xhr, status, info) {
  alert(xhr.status + ':' +xhr.statusText);
  alert(status + ':' + info);
});
//$.post()使用全局.ajaxError()事件提示错误
$(document).ajaxError(function (event, xhr, settings, infoError) {
  alert(xhr.status + ':' +xhr.statusText);
  alert(settings+ ':' + info);
});
三.请求全局事件
jQuery 对于 Ajax 操作提供了很多全局事件方法,.ajaxStart()、.ajaxStop()、.ajaxError()
等事件方法。他们都属于请求时触发的全局事件,除了这些,还有一些其他全局事件:
.ajaxSuccess(),对应一个局部方法:.success(),请求成功完成时执行。
.ajaxComplete(),对应一个局部方法:.complete(),请求完成后注册一个回调函数。
.ajaxSend(),没有对应的局部方法,只有属性 beforeSend,请求发送之前要绑定的函数。
//$.post()使用局部方法.success()
 $.post('test.php', $('form').serialize(), function (response, status, xhr) {
  $('#box').html(response);
  }).success(function (response, status, xhr) {
    alert(response);
});
//$.post()使用全局事件方法.ajaxSuccess()
$(document).ajaxSuccess(function (event, xhr, settings) {
  alert(xhr.responseText);
});
注意:全局事件方法是所有 Ajax 请求都会触发到,并且只能绑定在 document 上。而局
部方法,则针对某个 Ajax。
对于一些全局事件方法的参数,大部分为对象,而这些对象有哪些属性或方法能调用,
可以通过遍历方法得到。
//遍历 settings 对象的属性
$(document).ajaxSuccess(function (event, xhr, settings) {
  for (var i in settings) {
    alert(i);
  }
});
//$.post()请求完成的局部方法.complete()
$.post('test.php', $('form').serialize(), function (response, status, xhr) {
    alert('成功');
  }).complete(function (xhr,status) {
    alert('完成');
});
//$.post()请求完成的全局方法.ajaxComplete()
$(document).ajaxComplete(function (event, xhr, settings) {
  alert('完成');
});
//$.post()请求发送之前的全局方法.ajaxSend()
$(document).ajaxSend(function (event, xhr, settings) {
  alert('发送请求之前');
});
//$.ajax()方法,可以直接通过属性设置即可。
$.ajax({
  type : 'POST',
  url : 'test.php',
  data : $('form').serialize(),
  success : function (response, status, xhr) {
    $('#box').html(response);
  },
  complete : function (xhr, status) {
    alert('完成' + ' - ' + xhr.responseText + ' - ' + status);
  },
  beforeSend : function (xhr, settings) {
    alert('请求之前' + ' - ' + xhr.readyState + ' - ' + settings.url);
  }
});
注意:在 jQuery1.5 版本以后,使用.success()、.error()和.complete()连缀的方法,可以
用.done()、.fail()和.always()取代。

四.JSON 和 JSONP
如果在同一个域下,$.ajax()方法只要设置 dataType 属性即可加载 JSON 文件。而在非
同域下,可以使用 JSONP,但也是有条件的。
//$.ajax()加载 JSON 文件
$.ajax({
  type : 'POST',
  url : 'test.json',
  dataType : 'json',
  success : function (response, status, xhr) {
    alert(response[0].url);
  }
});
如果想跨域操作文件的话,我们就必须使用 JSONP。JSONP(JSON with Padding)是一个
非官方的协议,它允许在服务器端集成 Script tags 返回至客户端,通过 javascript callback 的
形式实现跨域访问(这仅仅是 JSONP 简单的实现形式)。
//跨域的 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://www.li.cc/test.php?callback=?', function (response) {
  console.log(response);
});
//$.ajax()方法跨域获取 JSON
$.ajax({
  url : 'http://www.li.cc/test.php?callback=?',
  dataType : 'jsonp',
  success : function (response, status, xhr) {
    console.log(response);
    alert(response.a);
  }
});
五.jqXHR 对象
在之前,我们使用了局部方法:.success()、.complete()和.error()。这三个局部方法并不
是 XMLHttpRequest 对象调用的,而是$.ajax()之类的全局方法返回的对象调用的。这个对象,
就是 jqXHR 对象,它是原生对象 XHR 的一个超集。
//获取 jqXHR 对象,查看属性和方法
var jqXHR = $.ajax({
  type : 'POST',
  url : 'test.php',
  data : $('form').serialize()
  });
for (var i in jqXHR) {
  document.write(i + '<br />');
}
注意:如果使用 jqXHR 对象的话,那么建议用.done()、.always()和.fail()代
替.success()、.complete()和.error()。以为在未来版本中,很可能将这三种方法废弃取消。
//成功后回调函数
jqXHR.done(function (response) {
  $('#box').html(response);
});
使用 jqXHR 的连缀方式比$.ajax()的属性方式有三大好处:
  1.可连缀操作,可读性大大提高;
  2.可以多次执行同一个回调函数;
  3.为多个操作指定回调函数;
//同时执行多个成功后的回调函数
  jqXHR.done().done();
//多个操作指定回调函数
  var jqXHR = $.ajax('test.php');
  var jqXHR2 = $.ajax('test2.php');
  $.when(jqXHR, jqXHR2).done(function (r1,r2) {
    alert(r1[0]);
    alert(r2[0]);
  });

    出处:瓢城 Web 俱乐部(ycku.com),主讲老师:李炎恢  
本版 本经过修改,整理  

Ajax 整理总结(进阶)的更多相关文章

  1. Ajax 整理总结(入门)

    Ajax 学习要点: 1.Ajax 概述 2.load()方法 3.$.get()和$.post() 4.$.getScript()和$.getJSON() 5.$.ajax()方法 6.表单序列化 ...

  2. 第二弹:超全Python学习资源整理(进阶系列)

    造一个草原要一株三叶草加一只蜜蜂.一株三叶草,一只蜂,再加一个梦.要是蜜蜂少,光靠梦也行. - 狄金森 "成为编程大牛要一门好语言加一点点天分.一门好语言,一点点天分,再加一份坚持.要是天分 ...

  3. 深度长文整理-Redis进阶

    目录 一.基础 二.为什么Redis是单线程的? 三.为什么单线程这么快? 四.select.poll.epoll 五.Redis的事物 六.Redis的监控 七.Redis的配置文件 八.Redis ...

  4. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(13)-Fiddler请求和响应断点调试

    1.简介 Fiddler有个强大的功能,可以修改发送到服务器的数据包,但是修改前需要拦截,即设置断点.设置断点后,开始拦截接下来所有网页,直到取消断点.这个功能可以在数据包发送之前,修改请求参数:在收 ...

  5. javascript/ajax和php 进阶 之 项目实战

    1,使用异步思想做一个下拉列表,能够选择和展示数据库中对应的信息. 1,事件知识:所有的事件可参照:https://www.jb51.net/html5/459444.html 2,js中this补充 ...

  6. 《MySQL 基础课程》笔记整理(进阶篇)(未完)

    一.MySQL服务安装及命令使用 安装过程就不写了,毕竟百度经验一大把 MySQL 官方文档 MySQL 参考手册中文版 1.MySQL简介 ​ RDBMS(Relational Database M ...

  7. Mysql数据库--语句整理/提升/进阶/高级使用技巧

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  8. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(9)-Fiddler如何设置捕获Https会话

    1.简介 由于近几年来各大网站越来越注重安全性都改成了https协议,不像前十几年前直接是http协议直接裸奔在互联网.还有的小伙伴或者童鞋们按照上一篇宏哥的配置都配置好了,想大展身手抓一下百度的包, ...

  9. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(10)-Fiddler如何设置捕获Firefox浏览器的Https会话

    1.简介 经过上一篇对Fiddler的配置后,绝大多数的Https的会话,我们可以成功捕获抓取到,但是有些版本的Firefox浏览器仍然是捕获不到其的Https会话,需要我们更进一步的配置才能捕获到会 ...

随机推荐

  1. cygwin下的第一次编程记录

    今天在window7上安装了cygwin,体验了一把unix,编了个小c,c++程序 先把过程记录下来 1.先删除以前建立的source文件夹 rm -rf source linux删除目录很简单,很 ...

  2. ImageList半透明,Alpha通道bug处理。

    由于ImageList的先天障碍,对alpha通道支持不好.虽然到xp有所改善,但瑕疵依然存在. 通过reflactor发现ImageList通过windows api来进行读写的.写入数据时会对原始 ...

  3. IEngineEditor与IWorkspaceEdit,以及相关的事件监听

    转自原文 IEngineEditor与IWorkspaceEdit,以及相关的事件监听 IEngineEditor适用于直接在图层上的编辑,例如使用"要素编辑"工具菜单上的&quo ...

  4. PYTHON不定参数与__DOC__

    def total(initial = 5, *numbers, **keywords): count = initial for number in numbers: count += number ...

  5. QT类库与Delphi类库的体系结构对比——两者十分类似!

    今天在看QT对象内存管理的一篇文章时:http://blog.csdn.net/dbzhang800/article/details/6300025想到了一个问题:就是QT类库体系结构与Delphi类 ...

  6. 转: 二十八、Java图形化界面设计——中间容器(Jpanel)

    http://blog.csdn.net/liujun13579/article/details/7762835 上一篇讲解了Jframe顶层容器,例子中生成了一个空的窗体,在实际编程过程中,一般很少 ...

  7. 33个优秀的HTML5应用演示 (转)

    33个优秀的HTML5应用演示 (转) HTML5能做什么?取代Flash?制作动画?开发程序应用?这些都只是HTML5的一小部分功能而已. 大家可能听到很多关于Flash是否会被HTML5取代的讨论 ...

  8. maven install 跳过 测试 test

    你可能想要配置 Maven 使其完全跳过单元测试. 可能你有一个很大的系统,单元测试需要花好多分钟来完成,而你不想在生成最终输出前等单元测试完成. 你可能正工作在一个遗留系统上面,这个系统有一系列的失 ...

  9. Linux下安装搜狗输入法

    目前的搜狗输入法 for Linux 是Linux Deepin 社区版的测试版,基于Fcitx 框架. 话不多说,直接上. 准备工作:卸载Ubuntu默认的ibus输入法: sudo apt-get ...

  10. selenium webdriver(2)---页面对象定位

    webdriver的元素定位很灵活,提供了多种定位方式: Id LinkText PartialLinkText Name TagName Xpath ClassName CssSelector 这些 ...