原生AJAX
概述
- 什么是ajax?
Asynchronous javascript and xml,异步的javascript和xml
ajax不是一个技术,是多个技术联合的产物。 - 异步和同步有什么区别?
A线程和B线程,并发执行,谁也不等谁,这就是异步
A线程和B线程,在A线程执行的时候B线程需要等待,或者B线程执行的时候
A线程需要等待,这就是同步。 - 传统的请求和ajax请求有什么区别?
传统的请求都是同步的,Ajax请求可以做到异步 - AJAX的经典案例
Google的auto_complete(输入框的自动补全)
Google的map(谷歌地图) - ajax解决的主要问题
页面的局部刷新问题,使用ajax可以在同一个页面当中并发的发送多个请求,
请求与请求之间互不等待,互不干扰,这样可以提高用户的体验。
总结:浏览器本身这个软件也是支持多线程并发的,其中ajax请求就是一个线程,
一个页面可以发送多个ajax请求多个ajax请求对应浏览器多个线程,当整个浏览器采用传统请求的时候,
请求只要一发送,整个浏览器窗口锁定无法点击其他按钮,并且浏览器会将窗口当中的数据全部清除,
迎接新的页面。
发送ajax步骤
1,创建ajax核心对象XMLHttpRequest(浏览器内置的,可以直接使用)
ajax发送请求全靠这个对象,使用XMLHttpRequest对象可以在浏览器中单独启动一个新的
浏览器线程,通过浏览器线程发送该请求,达到异步效果。var xhr; if(window.XMLHttpRequest){ xhr= new XMLHttpRequest(); }else{ //不支持XMLHttpRequest对象,IE5和IE6是不支持的,它只支持ActiveXObject对象 //IE5和6版本使用的是ActiveXObject这个内置对象发送ajax请求 xhr=new ActiveXObject("Microsoft.XMLHTTP"); }
2,注册回调函数
程序执行到这里的时候,后面的回调函数并不会执行,只是将回调函数注册给XMLHttpRequest对象
等该对象的readyState属性发生变化时,后面的回调函数才会执行。
XMLHttpRequest对象在请求和响应的过程中,该对象的readyState状态从0-4:
0:请求未初始化
1:服务器连接已建立
2:请求已接收
3:请求处理中
4:请求已完成,且响应已就绪
xhr.readyState==4xhr.onreadystatechange=function(){ //xhr对象的readyState的值发生改变的时候,回调一次 //xhr.status属性可以获取到HTTP的响应状态码 if(xhr.readyState==4&&xhr.status==200){ //responseText属性存放服务端响应的数据 alert(xhr.responseText) } }
3,开启浏览器和服务器之间的通道
method:指定请求方式为get还是post
url:请求路径
async:true/false(true表示支持异步,false表示支持同步)
什么时候使用false,当一个页面有多个ajax请求时,例如注册页面
必须等待所有表单项验证完毕之后,才允许用户点击注册,此时必须使用同步ajax机制//这里只开启通道,不发送请求 xhr.open("GET","请求路径?username="+username,true)
4,发送ajax请求
xhr.send(); //这里才会发送请求
发送ajax的get请求和post请求的区别
使用ajax向服务端发送数据的时候,如果是get请求则不用设置请求头
如果是post请求模拟表单方式提交,则需要设置请求头
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded ;charset=UTF-8");
如果前端发送的是json字符串给服务器,则设置的请求头应该是:
xhr.setRequestHeader("Content-Type","application/json")
post请求提交的数据在send方法中提交,xhr.send(param);
get请求提交的数据在url中添加http://localhost:8080/os/loginServlet?username="+username
但是GET请求在有些浏览器中会缓存,再次请求时,浏览器不会发送请求,
而是使用上次请求获取到的结果。解决办法是在url中加入时间戳var timeStamp = new Date().getTime(); var url = "http://localhost:8080/os/loginServlet? _="+timeStamp+"&username="+username;
数据格式转换
通过JSON传输数据,前端接收后端传过来的字符串,可以使用
//将后端传过来的字符串转换成json对象 var data=JSON.parse(xhr.responseText)
前端发送后端json字符串数据,发送前要将数据转成json字符串
//将param数据对象转成字符串 xhr.send(JSON,stringify(param))