1.XHR对象

IE7+、Firefox、Opera、Chrome和Safari都支持原生XMLHttpRequest对象,IE6不支持,只支持ActiveXObject对象,该对象在IE11中已经不再支持了。

IE中有三种不同版本的XHR对象MSXML2.XMLHTTP、MSXML2.XMLHTTP.3.0、MSXML2.XMLHTTP.6.0,所以可以通过一下函数创建一个兼容所有浏览器的XHR:

 function createXHR() {
if(typeof XMLHttpRequest != "undefined"){
return new XMLHttpRequest();
}else if(typeof ActiveXObject != "undefined"){
if(typeof arguments.callee.activeXString != "string"){
var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],i,len;
for(i=0,len=versions.length; i<len; i++){
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
break;
}catch (ex){
//跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else {
throw new Error("No XHR object available.");
}
}

或者简洁一点的:

 if(typeof window.XMLHttpRequest != 'undefined'){
var xhr = new XMLHttpRequest();
}else if(typeof window.ActiveXObject != 'undefined'){
var xhr = new ActiveXObject('Microsoft.XMLHTTP');
}

也可以达到兼容ie的效果。

2.XHR用法

        创建完XHR对象后可通过open方法启用一个请求,传入三个参数请求方法、url、是否异步(默认true)。调用完open方法后,请求并没有被发送,需要通过send()方法发送,发送时可附带一些请求数据,无需附带数据时传入null。通过readystatechange事件监听请求状态和http状态。通过responseText获取响应信息,或者通过responseType来设置响应信息的类型直接通过response属性获得响应数据来进行处理。

请求方式有两种GET、POST,get方式用于向服务器请求一些数据:

var btn = document.getElementById('btn');
btn.onclick = function () {
if(window.XMLHttpRequest != 'undefined'){
var xhr = new XMLHttpRequest();
}else if(window.ActiveXObject != 'undefined'){
var xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200){
alert(xhr.responseText);
}
} xhr.open("GET",'data.txt',true); //获取data.txt
xhr.send(null);
}

readyState为请求的状态码,每次状态变化都会触发readystatechange事件,通过监听该事件来判断是否成功收到响应。

0:未初始化

1:启用,调用了open方法

2:发送数据,调用了send

3:接收数据,但未完全接收

4:数据接收完毕,可以使用

当状态码为4的时候,服务器响应就完成了,但此时只是完成了响应,数据是否可用还要通过http的状态吗status来判断:

1xx:信息,服务器收到请求

2xx:成功,操作被成功接收并处理

3xx:重定向,需要进一步操做以完成请求

4xx:客户端错误,(404)请求资源地址不正确

5xx:服务器错误

当状态码为200是,则成功收到响应数据,所以只需判断status==200&&readyState==4就可以了。

get方式也可以发送少量数据,将数据附在url上传给服务器:

var btn = document.getElementById('btn');
btn.onclick = function () {
var text = encodeURIComponent(document.getElementById('active').value); //用encodeURIComponent对字符串进行编码,会将多余的空格等进行转码
if(window.XMLHttpRequest != 'undefined'){
var xhr = new XMLHttpRequest();
}else if(window.ActiveXObject != 'undefined'){
var xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200){
alert(xhr.responseText);
}
} xhr.open("GET",'test.php?active='+text,true);//将数据以键值对的形式附在url尾部,多个键值对之间用‘&’连接
xhr.send(null);
}

PHP:

$active = $_GET['active'];
if($active == 'login'){
echo '{"key":"value"}';
}else {
echo 'error';
}

但是get请求传递的数据都在url中所以安全性不高,需要发送数据一般用post请求,将请求数据通过send发送到服务器:

         var btn = document.getElementById('btn');
btn.onclick = function () {
var text = encodeURIComponent(document.getElementById('active').value); if(window.XMLHttpRequest != 'undefined'){
var xhr = new XMLHttpRequest();
}else if(window.ActiveXObject != 'undefined'){
var xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200){
alert(xhr.responseText);
}
} xhr.open("POST",'test.php',true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//设置头信息,以表单的形式发送
var str='active='+text;
xhr.send(str);
}

使用post请求发送数据时,服务器并不会像处理表单一样来处理收到的数据,所以要在send之前并且在open之后要通过setRequestHeader设置头信息,告诉服务器这是表单。 从性能角度看,post请求消耗的资源更多一点,get请求速度更快。

 3.超时设定

为XHR对象添加一个timeout属性来设置超时,当超过这个值时还未得到响应就会触发timeout事件并且会终止请求。

 xhr.open("POST",'test1.php',true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
var str = 'active='+text;
xhr.timeout = 1;
xhr.ontimeout = function() {
alert("Request did not return in a second.");
}
xhr.send(str);

timeout属性和ontimeout事件要放在open之后send之前,不然ie会报错,并且只有ie8+支持。

4.进度事件

在浏览器接收新数据期间会周期性的触发progress事件。该事件接收一个event对象,对象包含三个二外属性:lengthComputable、loaded、total,分别表示进度信息是否可用,接收到的字节数和总字节数。下面是一个通过Ajax请求图片的例子:

 <button id="btn">获取信息</button>
<div id="result"></div>
<div id="picture"></div>
<script>
btn.onclick = function(){
//创建xhr对象
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.onprogress = function(e){//监听progress事件来显示接收进度
e= e || event;
if(e.lengthComputable){
document.getElementById('result').innerHTML = '已接收:'+e.loaded+' /'+e.total;
}
}
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
var data = xhr.response;
var img = document.createElement("img");
img.src = URL.createObjectURL(data); //创建一个指向data的url
img.onload = function() {
URL.revokeObjectURL(img.src);
}
document.getElementById('picture').appendChild(img);
}
}
xhr.open('GET','RYH.png',true);
xhr.responseType = 'blob'; //响应数据类型为二进制数据
xhr.send(null);
}
</script>

这里的URL.createObjectURL(file | blob)传入一个file对象或blob(二进制对象)对象,创建一个指向该对象的URL。但是每次调用该方法时都会创建一个新的URL对象,即使指向的是同一个对象,所以每次创建完一个URL对象不再使用后要手动释放,通过URL.revokeObjextURL()来释放。

学习Ajax的更多相关文章

  1. 学无止境,学习AJAX,跨域(三)

    学习AJAX其实有个很重要的应用,就是为了执行另外几个站点的ASP,返回结果. 真正用起来,发现2个问题,>_> 不许笑,一向做DELPHI,接触ASP不多的我,的确问题大堆. 第一个问题 ...

  2. 由浅入深学习ajax跨域(JSONP)问题

    什么是跨域?说直白点就是获取别人网站上的内容.但这么说貌似又有点混淆,因为通常我们用ajax+php就可以获取别人网站的内容,来看下面这个例子. 来看看跨域的例子,jquery+ajax是不能跨域请求 ...

  3. 学无止境,学习AJAX(一)

    什么是AJAX?异步JavaScript和XML. AJAX是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的 ...

  4. 学习ajax总结

    之前公司的ajax学习分享,做一点总结,加深记忆 什么是ajax? 异步的的js和xml,用js异步形式操作xml,工作主要是数据交互 借阅用户操作时间,减少数据请求,可以无刷新请求数据 创建一个对象 ...

  5. 学习Ajax小结

    Ajax 学习         1.ajax的概念              局部刷新技术,不是一门新技术,是多种技术的组合,是浏览器端技术         2.作用             可以实现 ...

  6. 学习ajax 总结

    一.服务器客户端基础知识 通信是指不同计算机程序的通信,单单通过ip地址就能知道你找的是哪一台计算机,但是不知道是计算机上的哪个应用程序,要想知道是哪个程序就必须通过端口.这时候就可以问端口到底是什么 ...

  7. 学无止境,学习AJAX(二)

    POST 请求 一个简单 POST 请求: xmlhttp.open("POST","demo_post.asp",true); xmlhttp.send(); ...

  8. 对学习Ajax的知识总结

    1.对Ajax的初步认识 1.1. Ajax 是一种网页开发技术,(Asynchronous Javascript + XML)异步 JavaScript 和 XML: 1.2.Ajax 是异步交互, ...

  9. [Django学习]Ajax访问静态页面

    Web开发中常用的一种开发方式是:通过Ajax进行系统的交互,采用Ajax进行交互的时候,更多的时候传输的是JSON格式的数据. 所以开发中我们需要将数据格式转化成JSON,请参见:https://w ...

随机推荐

  1. 我的hibernate学习记录(一)

    之前已经过滤一下hibernate的简单的用法,但是近期有点时间,所以重新看下视频,敲下代码,翻下笔记,写博客与大家分享一下. hibernate简介 Hibernate是一个开放源代码的对象关系映射 ...

  2. 团队作业4——第一次项目冲刺(Alpha版本)

    Deadline: 2017-4-30 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目包括后文的两个个方面 七天的敏捷冲刺 日志的集合贴 晚交 - 0分 迟交一周以上 - ...

  3. 结对编程1——四则运算-GUI

    码市链接:https://coding.net/u/hmhhh/p/hmh-homework/git/tree/master/ 201421123003 黄建英 201421123004 黄美海 题目 ...

  4. 201521123002《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 先查看源代码 con ...

  5. 201521123103 《Java学习笔记》 第七周学习总结

    一.本周学习总结 1.以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 二.书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: pub ...

  6. 201521123004《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  7. 201521123080《Java程序设计》第3周学习总结

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...

  8. 201521123071 《JAVA程序设计》第十三周学习总结

    第13周作业-多线程 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 1.常用端口号:Web服务:80 FTP服务:21 Telnet服务:23 2.网络 ...

  9. java第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中fin ...

  10. 框架应用:Mybatis (三) - 关系映射

    你有一张你自己的学生证?(一对一) 你这一年级有多少个学生?(一对多) 班上学生各选了什么课?(多对多) 两张表以上的操作都需要联立多张表,而用SQL语句可以直接联立两张表,用工程语言则需要手动完成这 ...