Ajax用一句话来说就是无须刷新页面即可从服务器取得数据。注意,虽然Ajax翻译过来叫异步JavaScript与XML,但是获得的数据不一定是XML数据,现在服务器端返回的都是JSON格式的文件。

完整的Ajax请求过程

完整的Ajax请求过程创建XMLHttpRequest实例

发出HTTP请求

接收服务器传回的数据

更新网页数据

下面先看一个红宝书上给出的发起Ajax请求的例子,API的用法在后面章节给出。var xhr = new XMLHttpRequest(); // 创建XMLHttpRequest实例

xhr.onreadystatechange = function(){

if (xhr.readyState == 4){ // 判断请求响应过程阶段,4 阶段代表已接收到数据

if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码

console.log(xhr.responseText); // 输出响应的文本

} else {

console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码

}

}

};

xhr.open('get', 'example.txt', true); // 初始化xhr实例,或者说启动请求

xhr.send(null); // 设置HTTP请求携带参数,null为不带参数

Ajax请求过程详解

1. 创建XMLHttpRequest实例

从上面的的代码可以看出,创建一个XHR实例方式为:var xhr = new XMLHttpRequest();

2. 发出HTTP请求

实例创建好后,首先需要启动一个HTTP请求,使用XHR的open()方法,open方法接受三个参数XMLHttpRequest.open(method, url, isAsync)

// 例如

xhr.open('get', 'http://www.baidu.com', true)

第一个参数为http请求使用方法,如(’get’,’post’等),第二是参数是请求的url, 第三个参数代表是否异步发送请求(可选)。调用open()方法后会启动一个http请求,但它不会立即发送请求,处于待命状态。需要注意的是:请求的url必须要跟请求源域(origin)同域,也就是说协议、域名、端口号要一致,跨域请求要使用别的方法。接着调用send()方法就会发出这个http请求。xhr.open('get', 'http://www.baidu.com', true)

xhr.send(null)

send()方法接受一个参数,为http请求发送的数据(通常用于’post’方法),如果为null,表示不发送数据。至此,一个异步的http请求就发送到了服务器。

3. 接收服务器传回的数据

3.1 发送同步请求

如果将open方法的第三个参数设为false,即为同步请求,当收到服务器的响应后,相应的数据会自动填充到XHR对象的属性中,主要包括以下四个:responseText:作为响应主体被返回的文本。

responseXML: 响应返回的XML文档,能接收到的前提是,响应的Content-Type字段的值为

text/xml或者application/xml。

status: HTTP状态码。

statusText: HTTP状态码说明。

当客户端收到以上信息后,首先要判断HTTP状态码来确认响应是否成功,状态码在200-300之间表示请求成功,同时304代表请求资源未被修改,可使用浏览器本地缓存。如果成功就可以获取响应报文主体中的数据了。xhr.open('get', 'http://www.baidu.com', false)

xhr.send(null)

if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码

console.log(xhr.responseText); // 输出响应的文本

} else {

console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码

}

3.2 发送异步请求

如果将open方法的第三个参数设为true,即为异步请求。那么就需要一个事件来通知程序异步请求的结果是否返回。XHR对象中的readyState属性,表示请求/响应整个过程所处的阶段,它有五个值分为对应五个阶段:0:未初始化。未调用open()方法。

1:启动。已经调用open()方法,但未调用send()方法。

2:发送。已调用send()方法,但未收到响应。

3: 接收。已经接收到部分响应数据。

4:完成。已经接受到全部响应数据。

readyState的值每变化一次,都会触发一次readStatechange事件,我们定义一个事件处理函数onreadStatechange(),并监听readyState == 4状态,就可以得知响应数据已全部收到,并进行下一步操作。那么就是文章开头给出的代码:var xhr = new XMLHttpRequest(); // 创建XMLHttpRequest实例

xhr.onreadystatechange = function(){

if (xhr.readyState == 4){ // 判断请求响应过程阶段,4 阶段代表已接收到数据

if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码

console.log(xhr.responseText); // 输出响应的文本

} else {

console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码

}

}

};

xhr.open('get', 'example.txt', true); // 初始化xhr实例,或者说启动请求

xhr.send(null); // 设置HTTP请求携带参数,null为不带参数

补充XHR中三个有用的事件

timeout事件

当超出了设置时间还未收到响应,就会触发timeout事件,进而调用ontimeout事件处理程序。同时timeout也是XHR的一个属性,用于设置这个时间阈值。下面是用法:xhr.ontimeout = function() {

alert('timeout!')

}

xhr.open('get', 'http://www.baidu.com', true)

xhr.timeout = 1000 // 时间阈值设为1秒

xhr.send(null)

load事件

load事件用于简化对readState值的判断,响应数据全部接收完毕后(也就是readState == 4)会触发load事件,使用onload事件处理函数进行后续操作,onload会接收一个event对象,它的target属性等于XHR对象,当然我们在定义这个事件处理函数时也可以不传入这个参数,来看下面的用法:var xhr = new XMLHttpRequest()

xhr.onload = function () {

if(xhr.status >=200 && xhr.status < 300 || xhr.status == 304) {

console.log(xhr.responseText); // 输出响应的文本

} else {

console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码

}

}

xhr.open('get', 'http://www.baidu.com', true)

xhr.send(null)

这样就不用去关心readyState值的变化情况了。当然如果想在特定readyState值上做一些逻辑处理,还是要用之前的方法。

progress事件

这个是很有用的一个事件,progress事件会在浏览器接收数据期间周期触发,代表整个请求过程的进度,它的事件处理程序onprogress接收一个event对象,event.target是XHR对象,另外event还有三个属性:lengthComputable:Boolean值,进度信息是否可用。

position:已经接收到的字节数。

totalSize:总共要接收的字节数,被定义在响应报文的Content-Length字段中。

如果响应报文中有Content-Length字段,那么我们就可以计算当前时刻响应数据的加载进度了,这也是之前看到的一个面试题。看下面的代码:xhr.onprogress = function(event) {

if(event.lengthComputable) {

console.log(`Received: ${(event.position/event.totalSize).toFixed(4)*100}%`);

}

}

其他还有很多有用的API,如FormData表单序列化,overrideMimeType()重写XHR响应的MIME类型等等,后面慢慢更新。

ajax主要有哪些方法,ajax的使用方法和原理,ajax包括哪些技术呢相关推荐

  1. IE浏览器下ajax缓存导致数据不更新的解决方法

    IE浏览器下ajax缓存导致数据不更新的解决方法 参考文章: (1)IE浏览器下ajax缓存导致数据不更新的解决方法 (2)https://www.cnblogs.com/xcsn/p/4745437 ...

  2. Ajax跨域问题的两种解决方法

    Ajax跨域问题的两种解决方法 参考文章: (1)Ajax跨域问题的两种解决方法 (2)https://www.cnblogs.com/pandang/p/5341250.html 备忘一下.

  3. ajax返回实体类字符串,js使用ajax传值给后台,后台返回字符串处理方法

    之前使用js获取后台生成的JSON字符串,然后给select填充值,这次需要重新获取一次. 这里的目标是,在一个input输入框里,输入一个用户名,判断是否为空,是否不存在,如果存在返回几个字段给前台 ...

  4. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  5. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法及优缺点分析

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  6. js ajax java传参_js使用ajax传值给后台,后台返回字符串处理方法

    之前使用js获取后台生成的JSON字符串,然后给select填充值,这次需要重新获取一次. 这里的目标是,在一个input输入框里,输入一个用户名,判断是否为空,是否不存在,如果存在返回几个字段给前台 ...

  7. JQuery中使用Ajax赋值给全局变量失败异常的解决方法,jqueryajax

    我们在用JQuery的Ajax从后台提取数据后想把它赋值给全局变量,但是却怎么都赋不进,为什么呢? 原因其实很简单,我们用的Ajax是异步操作,也就是说在你赋值的时候数据还没提取出来,你当然赋不进去, ...

  8. CSS、JavaScript和Ajax实现图片预加载的三大方法及优缺点分析

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画 廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发 ...

  9. ajax漏洞 console_在实战中可能碰到的几种ajax请求方法详解

    前言 最近在做一个针对单个节点测速的功能页面,测速的逻辑是,测上传速度时,前端传5m数据给server,记录上传和返回数据的时间,测下载速度时,从server下载1m的数据,记录下载和下载成功的时间, ...

  10. ajax get 不会缓存,ajax的get请求时缓存处理解决方法

    ajax的get请求时缓存处理解决方法 本文实例讲述了ajax的get请求时缓存处理解决方法.分享给大家供大家参考.具体分析如下: 很多时候在Ajax的get方法调用的时候由于缓存的原因无法及时获取正 ...

最新文章

  1. 视频+课件| 室内动态变化场景中的相机重定位(CVPR2021)
  2. JAVA 读取图片储存至本地
  3. java设计模式---构建者模式
  4. 数据驱动才是零售企业转型的核心!
  5. [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件...
  6. js的comet各个浏览器封装lib
  7. js各种方法继承以及优缺点
  8. mysql的等号是什么意思_整理思维——等于等于等于?{MySQL条件等号的异常}
  9. 教你玩转CSS 尺寸 (Dimension)
  10. 阿里云刘伟光:金融核心系统将步入分布式智能化的时代
  11. 一文掌握关于Java数据结构所有知识点(欢迎一起完善)
  12. 综述 | Google-斯坦福发布~深度学习统计力学
  13. 做风控的你,GPS数据有没有这样用?
  14. 全国计算机考试照片传不上去,成人高考报名照片传不上去怎么办
  15. 魔兽世界服务器同时在线人数,魔兽世界服务器人数,魔兽世界服务器人数查询...
  16. kuberntes集群不能解析service ip故障排查记录
  17. DCOS :私有云的物理基础架构管理引擎
  18. 分享程序员面试的7个技巧
  19. STM32学习笔记(三)——外部中断的使用 1
  20. 全国计算机一级考试理论部分,全国计算机等级考试一级理论题

热门文章

  1. Linux进程调度:完全公平调度器 Completely Fair Scheduler 内幕| linux-2.6
  2. DPDK跟踪库:trace library
  3. 【转】linux通配符和正则表达式
  4. Java中,与;||与|的区别
  5. Spring Boot 学习之,数据库一 Spring-Data-Jpa 初探
  6. c语言输出数字菱形北京理工大学,C语言程序的设计—北京理工大学MOOC提交作业.docx...
  7. linux系统无法读取硬盘,安装CentOS时读取硬盘错误解决办法
  8. php获取微信小程序用户头像,微信小程序获取用户头像+昵称+openid,小程序登录!附前端后端源码!...
  9. 打印机如何共享多台电脑_多台电脑打印机共享的方法
  10. java声明代码是什么_java安全编码指南之:声明和初始化说明