[XMLHttpRequest]是一个浏览器接口,使得Javascript可以进行HTTP(S)通信。
ajax就是其衍生出来的一个框架,然而HTML 5的概念形成后,W3C开始考虑标准化这个接口。2008年2月,就提出了[XMLHttpRequest Level 2]草案。
支持不同的浏览器,有些浏览器因为本身原因并不支持,所以ajax需要不同创立函数(这里引用网上大部分教程的if函数)
因为不同版本的XMLHttpRequest(因为支持的浏览器不同);XML所拥有不同的用法
如果我们想打开一个网页:
xmlhttp.open(' 请求方式 ',' 网址(url)' )(同域传输)
xmlhttp.send()
这样就可以完成请求,等待主机做出响应,这时候就需要它的回调函数
xmlhttp.readyState:XMLHttpRequest对象的状态,等于4表示数据已经接收完毕。(一个分出了个过程,一般情况下4是我们比较常用的)
xmlhttp.status:服务器返回的状态码,等于200表示一切正常
xmlhttp.responseText:服务器返回的数据以文本方式显示
xmlhttp.responseXML:服务器返回的XML格式的数据
xmlhttp.statusText:服务器返回的状态文本。
虽然好像看起来这样强求没什么问题,但是仔细一想,http协议中很多属性并没有显示出来
所以老版本就有很多缺点:
所以就推出了新版本的XMLHttpRequest对象
新版本多出了以下功能:
1.有时,ajax操作很耗时,而且无法预知要花多少时间。如果网速很慢,用户可能要等很久。
新版本的XMLHttpRequest对象,增加了timeout属性,可以设置HTTP请求的时限。
xmlhttp.timeout=xxxx;
计时单位为毫秒,如果超过这个时长就会自动停止http请求
也可以创建一个函数提醒一下自己什么时候请求挂掉了
目前,Opera、Firefox和IE 10支持该属性,IE 8和IE 9的这个属性属于XDomainRequest对象,而Chrome和Safari还不支持。
ajax操作往往用来传递表单数据。为了方便表单处理,HTML 5新增了一个FormData对象,可以模拟表单。
AJAX中我们需要新建一个FormData对象
var formData = new FormData();
例如以下表单选项
formData.append('username', '三');
formData.append('id', 123456);
然后,传输对象
xmlhttp.send(formData);
然后 我们说一下上传文件
假定files是一个"选择文件"的表单元素(input[type="file"]),我们将它装入FormData对象。
函数:
var formData = new FormData();
for (var i = 0; i < files.length;i++)
{
formData.append('files[]', files[i]);
}
xmlhttp.send(formData);
跨域资源共享(CORS)
条件:使用"跨域资源共享"的前提,是浏览器必须支持这个功能,而且服务器端必须同意这种"跨域"。
xmlhttp.open('GET', '网址');
目前,除了IE 8和IE 9,主流浏览器都支持CORS,IE 10也将支持这个功能。具体事宜还需要你们自己设置一下
然后我们来说一下接受数据的进化、
新版的XMLHttpRequest可以接收二进制数据,分以下2种方法
第一种:
老版一点的是改写数据的MIMEType,将服务器返回的二进制数据伪装成文本数据,并且告诉浏览器这是用户自定义的字符集。
xmlhttp.overrideMimeType("text/plain; charset=x-user-defined");
然后,用responseText属性接收服务器返回的二进制数据。
var binStr = xmlhttp.responseText;
由于这时,浏览器把它当做文本数据,所以还必须再一个个字节地还原成二进制数据。
for (var i = 0, len = binStr.length; i < len; ++i) {
var c = binStr.charCodeAt(i);
var byte = c & 0xff;
}
最后一行的位运算"c & 0xff",表示在每个字符的两个字节之中,只保留后一个字节,将前一个字节扔掉。原因是浏览器解读字符的时候,会把字符自动[解读]成Unicode的0xF700-0xF7ff区段。
老板的放法还是很繁琐的,但好在思路清晰
新版的方法是使用新增的responseType属性。如果服务器返回文本数据,这个属性的值是"TEXT",这是默认值。较新的浏览器还支持其他值,也就是说,可以接收其他格式的数据。
var xhr = new XMLHttpRequest();
xhr.open('GET', '/path/to/image.png');
接收数据的时候,用浏览器自带的Blob对象即可
var xhr.responseType = new Blob([xhr.response], {type: 'image/png'});
进度信息
定义:新版本的XMLHttpRequest对象,传送数据的时候,有一个progress事件,用来返回进度信息。
它分成上传和下载两种情况。下载的progress事件属于XMLHttpRequest对象,上传的progress事件属于XMLHttpRequest.upload对象。
我们来看函数
首先:
我们先定义progress事件的回调函数。
xmlhttp.onprogress = updateProgress;
xmlhttp.upload.onprogress = updateProgress;
然后,在回调函数里面,使用这个事件的一些属性。
function updateProgress(event) {
if (event.lengthComputable) {
var percentComplete = event.loaded / event.total;
}
}
上面的代码中,event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0。