Ajax的本质是什么?如果不允许你使用现有的Ajax任何组件,以及JavaScript的XMLHttpRequest,有什么变通的方法,也可以实现类似的效果?假设页面上有上下两个文本框,上面的文本框用于显示聊天的内容,下面一个文本框 用于书写待发送的文字,用文字描述一下你的实现思路。

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
ajax作用:在不刷新整个页面情况下,更新部分网页
ajax实质:ajax全部的工作都由一个对象来做,XMLHttpRequest对像(简写xmlhttp)
它使浏览器可以为用户提供更为自然的浏览体验。在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的“思考时间”同步。Ajax提供与服务器异步通信的能力,从而使用户从请求/响应的循环中解脱出来。借助于Ajax,可以在用户单击按钮时,使用JavaScript和DHTML立即更新UI,并向服务器发出异步请求,以执行更新或查询数据库。当请求返回时,就可以使用JavaScript和CSS来相应地更新UI,而不是刷新整个页面。最重要的是,用户甚至不知道浏览器正在与服务器通信:Web站点看起来是即时响应的。

每个浏览器都有自己的一套操作HTTP的接口。
AJAX是一套是统一的操作接口标准,方便给开发者调用。
各个浏览器会自己实现标准规定的接口,这些接口在后台会调用自己的HTTP接口。
AJAX请求的过程中浏览器会启动一个线程进行http请求。

概念

一句话概括,Ajax就是用JS向服务端发起一个请求,并获取服务器返回的数据。在未出现Ajax之前,客户端与服务器之间进行数据交互,只能通过特定的标签来实现。如a标签来请求一个新的页面,img、iframe、script等,使用这些标签不是需要刷新页面,就是只能请求到特定的数据。这样的局限性很大。
Ajax可以做到不刷新页面,且可以获得任意类型的数据。需要了解Ajax是一种技术方案,它不是一种新技术。它是在异步JS和XMLHttpRequest的基础上实现的。那么它是如何实现不刷新页面来获取数据的呢?这里就需要介绍XMLHttpRequest对象。

XMLHttpRequest

XMLHttpRequest是浏览器提供的一个对象,且W3C对它进行了标准化。XMLHttpRequest标准又分为Level 1和Level 2。 XMLHttpRequest Level 2中新增了以下功能:

  • 可以发送跨域请求,在服务端允许的情况下;
  • 支持发送和接收二进制数据;
  • 新增formData对象,支持发送表单数据;
  • 发送和获取数据时,可以获取进度信息;
  • 可以设置请求的超时时间;

了解了XMLHttpRequest对下,下面继续来看一下它的属性和方法:
属性

  • readyState(只读): HTTP请求的状态,可取值为0-4。这个值每次变化都会触发onreadystatechange()事件。
  • responseText(只读): 响应体(不包括头部)
  • responseXML(只读): 对请求的响应,解析为XML并作为Document对象返回。
  • status(只读): 由服务器返回的HTTP状态代码。
  • statusText(只读): 用名称描述请求的HTTP状态码。
  • timeout: 请求的限制时间,单位为毫秒。

事件句柄

  • onreadystatechange: 每次readyState变化都会触发onreadystatechange()。
  • ontimeout: 当请求超时后调用。
  • onloadstart: 调用xhr.send()方法后立即触发。
  • onload: 请求完成时触发。
  • onloadend: 请求结束时触发。

方法:

  • abort(): 取消当前响应,关闭连接并且结束任何未决的网络活动。
  • getAllResponseHeaders(): 把HTTP响应头部作为为解析的字符串返回。
  • getResponseHeader(): 返回制定的HTTP响应的头部的值。将要返回的HTTP响应的头部的名称作为参数传递进去。
  • open(method,url,async): 初始化HTTP请求参数,但是并不发送请求。method:请求类型。
  • send(): 发送HTTP请求,使用传递给open()方法的参数,以及传递给该方法的可选请求体。
  • setRequestHeader(name, value): 向一个打开但为发送的请求设置请求头。这个方法必须在open()方法之后,send()方法之前调用。

readyState存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪