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. ServletResponse的一些知识点

    ServletResponse* 服务器对浏览器做出的响应,将需要发送给浏览器的所有数据全部存放在此对象上.* 发送数据,使用流操作,将所需要的数据,存放在指定的流中,数据将显示到浏览器中* 字符流 ...

  2. Linux设置全局代理与yum代理

    设置全局代理,方法如下: 修改 /etc/profile 文件,添加下面内容: http_proxy=http://username:password@yourproxy:8080/ ftp_prox ...

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

    在下午的1,2节软件课程结束后,我们teamworkers全体队员在禹州楼302利用课间时间进行约15分钟的短暂会议,会议的内容为阐述昨天开发遇到的问题,大家都提出自己的看法,最后统一了意见,队员互相 ...

  4. 201521123098 《Java程序设计》第3周学习总结

    1. 本周学习总结 1. 学习了类的创建: 2. 学会利用快捷方式完成变量的getter和setter的设定: 3. 学会了静态变量和非静态变量的区别和定义: 4. 学习了构造函数的基本编写方法. 大 ...

  5. Win8打开chm右侧空白解决方法

    Win8下打开CHM文件,左侧有目录,但是右侧空白.而且打开的时候,还弹出很多IE窗口. 感觉应该不是文件本身的问题.下面是我的解决方法,其他系统也可以试一试. 最初打开文件如下 首先:1,右键关联c ...

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

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

  7. 201521123027 <java程序设计>第十周学习总结

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

  8. 深度学习(一)cross-entropy softmax overfitting regularization dropout

    一.Cross-entropy 我们理想情况是让神经网络学习更快 假设单模型: 只有一个输入,一个神经元,一个输出   简单模型: 输入为1时, 输出为0 神经网络的学习行为和人脑差的很多, 开始学习 ...

  9. oracle-获取数据库中所有表的注释 comments

    公司dba提供的脚本: set serveroutput on set feedback off spool /tmp/getcomments.out select 'comment on table ...

  10. 【译】The Accidental DBA:SQL Server Backup

    最近重新翻看The Accidental DBA,将SQL Server Backup部分稍作整理,方便以后查阅.此篇是Part 1Part 2:The Accidental DBA:Troubles ...