ajax(分析ajax的使用)

一、远古时代的ajax

1.利用http协议的204特性

设置header('HTTP/1.1 204 No Content'),当浏览器收到204时页面不做跳转

2.利用图片加载的特性来完成请求

设置src属性,浏览器将会请求src对应的资源

hh.setAttribute('src', './01-vote.php')

3.利用css,js加载的特完成请求,原理与加载图片完全一样

4.利用ifream特性

iframe为嵌套在页面内的另一个页面,form表单的action请求路径,method为请求方法,target的请求名和iframe的name保持一致,则相当于请求的targe为iframe页面,进而实现页面无刷新,且请求成功的需求。

总结:在不适用xmlHttpRequese对象的情况下,依然可以用jsz实现对后台服务器的请求,同时不带来页面的刷新或跳转。

所谓ajax,是指页面不刷新的情况下,利用XMLHttpRequest发送http请求,也就是js的网络化。

问题:ajax上传文件能实现吗?ajax上传插件是怎么实现的?

从http协议角度看,上传文件,则要把文件的内容发送到服务器,如果XMLHttpRequest对象在post数据时把文件的内容也发送过去。

js读取本地的文件内容-->XHR对象获取要上传的文件的内容

但浏览器出于安全考虑,js是不能读取到文件内容的,所以ajax上传文件是无法实现的

上传插件的实现方式:ifream,flash,html5(增加文件读取api)

二、现代的Ajax

核心:XMLHttpRequest对象,一个专门的http请求工具(需要考虑ie浏览器的兼容性)

分析:

1.如何创建该对象

按标准浏览器,new XMLHttpRequest()即可得到

考虑低版本ie,new ActiveXObject('Micorsoft.XMLHTTP')

2.如何利用xhr发送请求,获取后台服务器资源?

分析http协议,要请求需要明确这样几个因素:

(1)用什么方法请求:get,post,put,delete,head

(2)请求哪个资源:需要请求的url地址

(3)同步还是异步?true异步,false同步

创建xhr对象:var xhr = new XMLHttpRequest()

打开连接:xhr.open('GET', './01-vote.php', true)

发送请求:xhr.send(null)

获取到请求结果: alert(xhr.responseText)

3.请求的结果如何利用上?

如果为同步,则程序表现为2秒之后才alert,且获取到返回值,

如果为异步,则程序表现为立即弹出alert框,内容是空的,但两秒之后可以获取到返回值。

所以如果使用异步的话,下面的代码继续执行,等请求最终完成,怎么知道这个变化?

xhr对象在请求与响应过程中,状态会由0-4发生变化,可以绑定一个函数监听状态的变化,只要状态发生变化就触发某函数

xhr.onreadystatechange = function(){

console.log(this.readyState, '读取请求过程中的状态0-4,4意味着请求完成')

}

如果readyState的状态为4且返回值responseText为1,则可以使用请求后的结果,这也是使用异步的好处

三、深度探讨ajax

1.XMLHttpRequest的详细属性

responseText 服务器响应的主体信息

responseXML 对于大量的格式化文档,可以用XML来传输或交换,由后台程序把数据封装在xml文档,js接收xml对象并解析该内容

status 服务器的返回状态码,200成功,403禁止,400请求语法错误,404未找到,5xx内部服务器错误

statusText 服务器返回状态码对应的文字描述

readyState xhr对象自身的状态码(0,1,2,3,4)

onreadystatechange 事件属性,当xhr对象的状态码发生变化时触发,xhr发送请求后在此方法里通过status 和readyState 来确定请求成功并且获取到数据后去做一些操作

2.XMLHttpRequest的详细方法

open('请求方式',url,同步/异步),使用post请求时请求头必须加上Content-type和Content-length

send(),没参数时传null,有参数时传‘usernam=11&email=11’这种形式的

setRequestHeader(key,value) 设置请求头信息

getResponseHeader 获取响应的某个头信息

getAllResponseHeaders 获取响应的所有头信息

3.返回值类型

 xml类型

   普通文本:

  返回简短的标志字符串,如:0,1,ok

  后台返回大段的html代码,直接innerHTML到前端页面

  返回json格式,再由前端去解析

  返回jsonp(跨域时使用)

    浏览器默认是不能跨域的,使用jsonp可以实现跨域请求,jsonp目前没有统一的规范,一般都是前后端约定以什么样的方式请求,以什么样的方式返回数据

    请求的url地址一般是 :‘http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=11&callback=aa’

    aa为回调函数

    function aa(res){

      console.log(res, '请求成功后,res为获取到的数据')

    }

4.异步原理

  状态值:

    0 XHR对象刚创建时

    1 open成功后为1,此时已建立连接成功

    2 接收头信息完毕

    3 接收body信息完毕后

    4 成功结束后

  同步:代码从上往下依次执行,必须等前一个执行完后才能继续往下执行

  异步: 代码从上往下执行,当前执行代码不影响后面的代码执行,当当前代码需要回调时可立即插队到进程最前列执行

 

 

  

posted @ 2019-06-11 13:51  但沉默。  阅读(407)  评论(0编辑  收藏  举报