1、Ajax: async javascript and xml 异步的JS和XML

AJAX 是一种用于创建快速动态网页的技术。 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。

2、Ajax创建四步法

我们都知道一个完整的Ajax动态网页的实现方法为:

var xhr = new XMLHttpRequest;
xhr.open("get","url",true);
xhr.onreasystatechange = function () {
"code gose there";
}
xhr.send(string);

下面我们就详细的解释一下上述的四个步骤。

2.1、Ajax -  创建一个Ajax XMLHttpRequest 对象

XMLHttpRequest 是 Ajax的基础。

XmlHttpRequest 术语缩写为XHR,中文可以解释为可扩展超文本传输请求。

所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。(IE5 和 IE6 使用 ActiveXObject)。

XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject ::

function createXHR() {
var xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest;
} else {
try {
xhr = new ActiveXobject("Microsoft.XMLHTTP");
} catch (e) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
}
}
}
return xhr;
}
var xhr = createXHR();

知上面的createXHR()方法每创建一个xhr对象,都会把createXHR方法执行一遍。

由于我们第一次执行的时候就已经知道该浏览器下支持哪个new方法。但是第二次执行createXHR方法的时候就仍需要再全部重新执行一遍。这显然会增加系统的开销。

所以我们可以用惰性思想的编程方式把支持浏览器的那个new方法返回来,这样就不需要每次执行时都把全部的代码执行一遍。

优化代码代码如下:

function createXHR() {
var xhr = null,
flag = false,
arr = [
function () {
return new XMLHttpRequest;
},
function () {
return new ActiveXObject("Microsoft.XMLHTTP");
},
function () {
return new ActiveXObject("Msxm12.XMLHTTP");
}
];
for (var i = 0; i < arr.length; i++) {
var curFn = arr[i];
try {
xhr = curFn();
//本次循环获取的方法没有出现错误:说明此方法是我想要的,我们下一次直接执行这个方法即可,,这就需要我把createXHR重写为本次循环得到的方法(完成后不需要再判断下面的,直接退出循环即可)
createXHR = curFn;
flag = true;
break;
} catch (e) {
//本次循环获取的方法执行时出现错误:继续执行下一次循环
}
        }
if (!flag) {
throw new Error("your browser is not support ajax,please change your browser,try again!");
} return xhr;
}
var xhr = createXHR();

2.2、AJAX - 向服务器发送请求

XMLHttpRequest 对象用于和服务器交换数据。

当你的页面全部加载完毕后,客户端会通过 XMLHttpRequest 对象向服务器请求数据,服务器端接受数据并处理后,向客户端返回数据。

如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:

xhr.open(method,url,async);
xhr.send(string);
  • 规定请求的类型、URL 以及是否异步处理请求。

    open(method,url,async)

      method:请求的类型;GET 或 POST

      url:文件在服务器上的位置,该文件可以是任何类型的文件

      async:true(异步)或 false(同步)

  • XMLHttpRequest 对象如果要用于 Ajax的话,其 open() 方法的 async 参数必须设置为 true。因为当设置成false(即同步)时,JavaScript 会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止。

   设置为true后,JavaScript 无需等待服务器的响应,而是:

    在等待服务器响应时执行其他脚本。

    当响应就绪后对响应进行处理。

  • send(string)

    将请求发送到服务器。

    string:仅用于 POST 请求,send方法也可以不传参数,不传参数的话,表示不向服务器发送请求数据

2.3、Ajax - 服务器响应

由于 HTTP 响应是由服务端发出的,并且服务器做出响应需要时间(比如网速慢等原因),
所以我们需要监听服务器响应的状态,然后才能进行处理。
获取来自服务器的响应,使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
  • xhr.responseText属性是获取字符串形式的响应数据
  • xhr.responseXML属性是获取XML形式的响应数据

2.4、Ajax - onreadystatechange 事件

当发送一个请求后,客户端需要确定这个请求什么时候会完成,因此,XMLHttpRequest对象提供了 onreadystatechange 事件机制来捕获请求的状态,继而实现响应。

当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当 readyState改变时,就会触发 onreadystatechange 事件。readyState 属性存有 XMLHttpRequest 的状态信息。

下面是 XMLHttpRequest 对象的三个重要的属性:

  • xhr.onreadystatechange

    存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。

  • xhr.readyState      

    存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。

      0:UNSET             请求未初始化,还没有调用open()。

      1:OPENED            请求已经建立,但是还没有发送,open()已被调用,还没有调用send()。

      2:HEADER_RECEIVED        请求已发送,已经调用send()函数。正在处理中(通常现在可以从响应中获取内容头)。

      3:LOADING           请求在处理中;通常响应中已有部分数据可用了,没有全部完成。

      4:LOADED            响应已完成;响应主体的内容已经成功返回到客户端(解析完成)

  • xhr.status:HTTP状态码,描述了服务器响应内容的状态

      200   OK /^2\d{2}/ (200或2开头的数字) 都代表响应主体的内容已经成功返回了

      301   永久重定向/永久转移
      302   临时重定向/临时转移
      304   本次获取的内容是读取缓存中的数据

      400   客户端传递给服务器的参数出现错误
      401   无权限访问
      404   客户端访问的地址不存在

      500   未知的服务器错误
      503   服务器已经超出负荷

当 readyState 等于 4 且状态为 200 时,表示响应已就绪:在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。

3、编写一个简易的Ajax方法库

由于每次编写Ajax方法都需要写下上面完整的Ajax四步,这无疑增加了我们的工作量。下面我们来编写一个一个Ajax方法,我们只需要调用这个方法就可以实现Ajax的XMLHttpRequest请求。

//ajax:实现AJAX请求的公共方法:当一个方法传递的参数值过多,而且不固定,我们使用对象统一传值法(需把要传递的参数值都先放在一个对象options中,一起传递进去即可)
function ajax(options) {
var _default = {
url : "", //请求的地址
type : "get", //请求的方式
dataType : "json", //设置请求回来的内容格式"json"(即json格式的对象)。"txt"就是字符串或json格式的字符串
async : true, //请求是同步还是异步
data : null, //放在请求主体中的内容(POST)
getHeaders : null, //当READYSTATE===2时执行的回调函数
success : null //当readystate===4时执行的回调函数
}
for (var key in options) {
if (options.hasOwnProperty(key)) {
_default[key] = options[key];
}
}
//如果当前的请求方式是GET,我们需要在URL的末尾添加随机数清除缓存
if (_default[type] === "get") {
_deauult[url].indexOf("?") >= 0 ? _default[url] += "&" :_default[url] += "?";
_default[url] += "_=" + Math.random();
}
var xhr = createXHR();
xhr.open(_default[type],_default[url],_default[async]);
xhr.onreadystatechange = function () {
if (/^2\d{2}$/.test(xhr.status)) {
//想要在readystate=2的时候做一些操作,需要保证ajax是异步请求
if (xhr.readyState === 2) {
if (typeof(_default[getHeaders]) === "function") {
_default[getHeaders].call(xhr);
} }
if (xhr.readyState == 4) {
var val = xhr.responseText;
if (_default.dataType === "json") {
val = "JSON" in window ? JSON.parse(val) : eval("(" + val + ")");
}
if (typeof(_default[success]) === "function") {
_default[success].call(xhr,val);
};//_default[success] && _default[success].call(xhr,val); }
}
}
xhr.send(_default[data]);//向请求主体传内容,但open方法中必须使用post请求方式
}

Ajax疯狂讲义的更多相关文章

  1. java8--类加载机制与反射(java疯狂讲义3复习笔记)

    本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...

  2. 参考《Java疯狂讲义》

    参考<Java疯狂讲义>Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例 1. Lambda ...

  3. java8--NIO(java疯狂讲义3复习笔记)

    NIO采用内存映射文件的方式处理输入输出,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式来进行输入输出比传统的 ...

  4. Java学习 面向对象(下)——Java疯狂讲义th4

    面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...

  5. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制

    内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...

  6. 《Java疯狂讲义》(第3版)学习笔记 1 - 如何学习Java

    1.Java是一种面向对象语言,不要简单当做脚本使用.从基础学起,不要从Spring.J2EE.Hibernate和EJB开始学. 2.不要浮躁,应该扎扎实实先学好Java语言,然后按Java本身的学 ...

  7. Java疯狂讲义(四)

  8. Java疯狂讲义(三)

  9. Java疯狂讲义(二)

随机推荐

  1. href

    <a href="#"></a>点击浏览器会跳转地址栏加了#:<a href=""></a>点击会打开当前网页所 ...

  2. Java Reflection 反射基础

    反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...

  3. jsp里的逻辑语句c:if和c:choose

    1.c:if <c:if test=""></c:if> c:when的test里可以是变量或者是一个EL表达式,其结果应该是true或者false. EL ...

  4. CCF系列之I’m stuck!(201312-5)

    试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', ...

  5. 一次__libc_message的排查

     信号是6,abort调用的.总体而言,当你malloc的指针为A,但是你free的指针不是A,则容易出这个错,当然假设你free的刚好是别人malloc的,则还是正常. 还有一种是你free的地址在 ...

  6. 使用Botkit和Rasa NLU构建智能聊天机器人

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 我们每天都会听到关于有能力涉及旅游.社交.法律​​.支持.销售等领域的新型机器人推出的新闻.根据我最后一次查阅的数据,单单Facebook Me ...

  7. 底部粘连(stiky footer)布局

    前面的话 在网页设计中,Sticky footers设计是最古老和最常见的效果之一,大多数人都曾经经历过.它可以概括如下:如果页面内容不够长的时候,页脚块粘贴在视窗底部:如果内容足够长时,页脚块会被内 ...

  8. sql 时间转换问题 from_unixtime() UNIX_TIMESTAMP()

    http://blog.csdn.net/test_soy/article/details/50328367 from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是 ...

  9. 一个自己稍作修改了的美赛论文LaTeX模板

    原模板(5.0)来自LaTeX工作室(latexstudio.net),我按照比赛规范做了一点小小的修改(5.0y),并加上了比原来更详细一些的注释,方便使用. 仅仅分享一下方便大家使用,模板的原创者 ...

  10. CentOS 7 修改SSH端口号 和 ssh无法使用密码登录 和 查看pid 端口占用

    如下示例把SSH默认端口22改为122. 1 修改/etc/ssh/sshd_config文件 #Port #找到改行,如果还想继续使用该端口,可以把#去掉,如果使用新端口,可以默认不管 Port # ...