Ajax技术,就是指:向服务器请求额外的数据而无须重新加载整个页面。其核心就是 XMLHttpRequest对象。(简称:XHR)

在这里,我们先讨论IE7及更高版本,以及FF,Opera,Chrome,Safari都支持的XHR。
创建一个XHR对象:
var xhr = new XMLHttpRequest();
XHR对象有几个方法,一个一个来:
open():

xhr.open("get","example.php",true);
这里有三个参数,get:表示ajax将以get请求的方式请求数据,example.php:是我们请求的URL,true:表示是以异步的方式发送请求。所谓异步,就是不用刷新整个页面,在后台浏览器后台发送请求。false:表示是同步的方式发送请求。
open()方法只是启动了一个请求,但是还未将此请求发出去。

send()
当执行:
xhr.send(null) 时,我们的请求就发送出去了。

当请求被处理完返回时,xhr对象会被填充一些相应的属性:
responseText:作为相应主体的文本。
responseXML:如果相应的数据类型是:text/xml 或者是 application/xml,这个属性中保存的是相应的XML DOM文档。
status:响应的HTTP状态
statusText:HTTP状态说明。

接收到响应时,应该先检查status的值,判断其是否成功。一般来说status的值为200表示成功,此时:responseText属性的内容已经被填充,responseXML属性的内容也已准备好。status的值为304表示请求的资源并没有更新,可以直接从浏览器的缓存中获取。这个也意味着响应是有效的。

如果请求是同步发送的,即:xhr.open("get","example.php",false),
那么我们紧接着写相应的处理代码就好:
xhr.open("get","example.php",false);
xhr.send(null);
if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
    alert("successful: "+xhr.status); //成功
}else{
    alert("unsuccessful :"+xhr.status); //失败
}

如果请求是异步发送的,那么我们就要写一个回调函数来处理请求发送后接下来应该要做的事。
我们可以通过检测xhr.readyState属性,该属性表示请求/响应过程的当前活动阶段。其属性取值为:
0:未初始化,未调用open()方法
1:启动,已调用open()方法,未调用send()方法
2:发送,已调用send()方法,未接收到响应数据
3:接收,已接收到部分响应数据
4:完成,已接收到全部响应数据,并且可以在浏览器中使用。

所以我们可以这样来写:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
          if( (xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                alert("successful : "+xhr.status);
           }else{
                alert("unsuccessful : "+xhr.status);
           }
    }
}
xhr.open("get","example.php",true);
xhr.send(null);

在这里为什么没有用this来替代xhr,是因为作用域的原因,用this来替代xhr,在有的浏览器中会执行失败。所以用xhr是一种比较可靠的方式。

可以使用DOM2级事件(addEventListener/removeEventListener ) 但是要注意浏览器支持。
在IE中,也可以使用IE的的事件处理程序(attachEvent/detachEvent)。不过用DOM0级事件是一种比较好的方式,因为它支持所有的浏览器。

可以调用xhr.abort()来取消异步请求,取消后,xhr对象停止触发事件,并且不允许访问任何有关响应的对象属性。
在终止请求后,最好解除掉xhr对象的引用,以释放内存空间。

在默认情况下:发送XHR请求的同时,会发送一下头部信息:
Accept:浏览器能处理的内容类型
Accept-Charset:浏览器能够显示的字符集,如:utf-8,gbk
Accept-Encoding:浏览器能够处理的压缩编码
Accept-Language:浏览器当前的语言,如:en,zh-Ch
Connection:浏览器与服务器之间的连接类型,如:keep-Alive
Host:发出请求页面所在的域
Cookie:当前页面设置的任何Cookie
Referer:发出请求页面的URI。
User-Agent:用户的浏览器代理

可以在发送前使用xhr.setRequestHeader()来增加一些头部信息:
xhr.open("get","example.php",true);
xhr.setRequestHeader("myheader":"myheader");
xhr.send(null);
但是最好不要修改默认的头部信息,即使有的浏览器支持这样做。

同样,在接收到响应之后,可以调用下列方法来获取头部信息:
xhr.getRequsetHeader("myvalue");
或者获取全部头部信息:
xhr.getAllRequestHeader();

GET请求:
GET请求通常带有一些查询的参数,比如:
xhr.open("get","example.php?page=1&search=2","true");

增加一个辅助函数来向当前的url末尾增加查询参数:
function addParam(url,name,value){
    url += (url.indexOf("?") == -1 ? "?":“&”);
    url += encodeURIComponent(name) + "=" +ecodeURIComponent(value);
    return url;
}

然后使用它:
var url = "example.php";
url = addParam(url,"page","1");
url = addParam(url,"search","2");
xhr.open("get",url,true);
xhr.send(null);

POST请求
可以使用XHR来模拟表单提交,需要修改xhr.open()方法为:
xhr.open("post","actionform.php",true);

另外需要增加头部信息:
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

然后是表单数据需要进行一些相应的处理:
var form = document.getElementsByTagName("form")[0];
xhr.send(serialize(form));
完整的模拟表单提交的POST请求就是:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
          if( (xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                alert("successful : "+xhr.status);
           }else{
                alert("unsuccessful : "+xhr.status);
           }
    }
}
xhr.open("post","actionform.php",true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(document.getElementsByTagName("form")[0]);

与GET请求相比,POST请求消耗的资源多一些。

现代Web应用中频繁使用的是表单数据的序列化,可以使用一个新的函数来实现:
var formData = new FormData();
formData.append("name","caibin");

或者使用另一种方法:
var formData = new FormData(document.getElementsByTagName("form")[0]);

进度事件:
与XHR相关的还有一些进度的事件:
loadstart:在接收到响应数据的第一个字节触发
progress:在接收到响应期间持续不断触发
error:请求发生错误时触发
abort:因为调用abort()方法触发
load:接收到完整响应数据时触发
loadend:通信完成或者触发error,abort,load事件后触发(暂没有浏览器支持)

每个请求都从触发loadstart开始,接下来是多个progress事件,然后触发error,abort,load中的一个,最后触发loadend事件。
其中对于progress事件:
xhr的onprogress事件处理程序会接收到一个event对象,其中event.target 就是xhr,然后event有三个很有用的属性:
lengthComputable:表示进度事件是否可用
position:表示已经接收到的字节数
totalSize:表示根据Content-Length响应头确定的预期字节数
我们可以用这些信息创建一个进度条:
主要的程序代码如下:
HTML:
<div id="progress"></div>
<span id="progressnumber">0%</span>
<button id="ajax">send ajax</button>

JavaScript:
document.getElementById("ajax").addEventListener("click",function(){
var xhr = new XMLHttpRequest();
xhr.addEventListener("load",function(event){
console.log(event.target.status);
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
console.log("successful ! "+xhr.status);
}else{
console.log("unsuccessful ! "+xhr.status);
}
});
xhr.addEventListener("loadstart",function(){
console.log(xhr.status);
});
var pro = document.getElementById("progress"),
pronum = document.getElementById("progressnumber");
xhr.addEventListener("progress",function(event){
//在控制台打印进度过程
if(event.lengthComputable){
if(event.position < event.totalSize){
console.log("正在加载数据:"+event.position+"/"+event.totalSize);
}else{
console.log("加载完成: "+event.position+"/"+event.totalSize);
var realSize = Math.ceil(event.totalSize / 1024);
var dw = ["KB","MB","GB","TB"],i=0;
while(realSize > 1024){
realSize = Math.ceil(realSize / 1024);
i += 1;
}
console.log("一共是:"+realSize+dw[i]);
}
                                                //不断修改进度条宽度
pro.style.width = (event.position / event.totalSize) * 200 +"px";
                                                //不断修改进度显示数据
pronum.innerHTML = (event.position / event.totalSize) * 100 + "%";
}
});
xhr.addEventListener("error",function(){
alert(xhr.status+" 错误");
});
xhr.addEventListener("abort",function(){
alert("被终止了");
});
xhr.open("get","example.php",true);
xhr.send();
});





JavaScript中Ajax的更多相关文章

  1. JavaScript中Ajax的使用

    AJAX全称为“Asynchronous javascript and XML”(异步javascript和XML),是指一种创建交互式网页应用的网页开发技术.通过在后台与服务器进行少量数据交换,AJ ...

  2. javascript中ajax的四大步骤

    原生js中ajax写法一: function ajaxys(){ //1. 创建xhr对象 var xhr = new XMLHttpRequest();//XMLHttpRequest() // 2 ...

  3. javascript中ajax post实例详解

    一,原生态的XMLHttpRequest 代码如下 复制代码 <script language="javascript">         function savei ...

  4. JavaScript中Ajax的get和post请求

    AJAX = 异步 JavaScript和XML(Asynchronous JavaScript and XML) 作用:在不重新加载整个网页的情况下,对网页的某部分进行更新.   两种请求方式: 1 ...

  5. JavaScript中Ajax的用法

    XMLHttpRequest 对象的属性和方法: open(method,url,async) 规定请求的类型.URL 以及是否异步处理请求 send(string)   将请求发送到服务器. res ...

  6. javaScript中ajax、axios总结

    一.原生js实现ajax请求: 步骤: get请求: // 1.创建一个XMLHttpRequest的对象. var xml=null; //初始值设为空 if(XMLHttpRequest){ xm ...

  7. javascript中Ajax的简单封装

    GET方式的在线:DEMO POST方式在线:DEMO // 1.封裝AJAX函數 function nativeAjax(option,success,error){ // 定义domain,方便环 ...

  8. Javascript 中ajax实现前台向后台交互

    第一种情况:前台传入字符串参数 后台返回json字符串.或是json数组  代码如下: 前台: $.ajax({ url: "xxx/xxx.action", data: &quo ...

  9. jQuery中Ajax的应用

    一.Ajax介绍 1.什么是Ajax 异步的JavaScript与XML技术,是一种广泛应用在浏览器的网页开发技术. 2.Ajax的优点 a.不需要任何浏览器插件,在任何支持JavaScript的浏览 ...

随机推荐

  1. Javascript-9-1-OOP-5-链式调用

    <html lang="en"> <head> </head> <body> <div class="" ...

  2. 关于header跳转之后的乱码

    http://www.360doc.com/content/11/0603/19/7052474_121495648.shtml 问题:不同网站的跳转出现乱码,不同编码的页面传递参数也出现乱码 搞清楚 ...

  3. JAVA反射参数传递

    引用:http://fish2700.blog.163.com/blog/static/130713192009103035723281/ 使用Method反射调用函数时,我们通常会遇到以下几种情况: ...

  4. 关于SMBIOS

    一, 1.什么是SMBIOS? A: SMBIOS(System Management BIOS),是主板或者系统制造者以标准的格式显示产品管理信息所需遵循的统一规范.也就是不管你是怎么去实现的,结果 ...

  5. APICloud开发App总结(一)

    apiCloud app 开发是最近一两年刚刚兴起的一种混合开发方式.常用的模块以原生方式开发好,然后用js进行粘合.组织,完成整个的app的逻辑.这种开发方式极大的提高了软件模块的复用率,加快了ap ...

  6. c#控制台調用SSIS包互传值

    有时候不仅仅需要在内部执行package包,多数情况下,是需要在外部进行调用,比如,需要一个批处理或者控制台程序进行外部调用SSIS包,而往往这个包所配置的连接字符串是经过加密处理的,所以当外部调用S ...

  7. Codeforces 747C:Servers(模拟)

    http://codeforces.com/problemset/problem/747/C 题意:有n台机器,q个操作.每次操作从ti时间开始,需要ki台机器,花费di的时间.每次选择机器从小到大开 ...

  8. jquery与自己写的js文件冲突解决办法

    先加载JQUERY,然后使用语句  jQuery.noConflict(); 再加载其他JS文件,后面在使用jQuery时都换下,如:$('#div') 换成 jQuery('#div'), 如果嫌j ...

  9. html(二)

    1无序列表 ul是没有前后顺序的信息列表. <ul> <li></li> <li></li> ...... </ul> ul在网 ...

  10. Mac OS Terminal 几个快捷键

    在Mac系统中几个键位组合可以使Terminal的操作更加灵活方便. 1.将光标移动到行首:ctrl + a 2.将光标移动到行尾:ctrl + e 3.清除屏幕:            ctrl + ...