JavaScript之AJAX

一、AJAX(全称Asynchronous JavaScript and XML):

        Ajax的概念由杰西·詹姆士·贾瑞特所提出,是综合了多项技术的浏览器端网页开发技术。传统的Web应用允许用户端填写表单(form),当提交表单时就向网页服务器发送一个请求。服务器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分HTML码往往是相同的。由于每次应用的沟通都需要向服务器发送请求,应用的响应时间依赖于服务器的响应时间,这导致了用户界面的响应比本机应用慢很多。但Ajax可以仅向服务器发送并取回必须的数据,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,请求数据更少所以服务器响应更快了。同时很多处理工作可以在发出请求的客户端上完成,因此Web服务器的负荷也减少了。可以看出Ajax最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。实际上数据格式除了用XML外,还可以使用Json即所谓的AJAJ,它们的基础是XMLHttpRequest。

二、XMLHTTP:

        XMLHTTP最初是由微软公司发明的,在Internet Explorer 5.0中用作ActiveX对象,可通过JavaScript、VBScript或其它浏览器支持的脚本语言访问。Mozilla的开发人员后来在Mozilla 1.0中实现了一个兼容的版本、之后苹果电脑公司在Safari 1.2中开始支持XMLHTTP,而Opera从8.0版开始也宣布支持XMLHTTP。

        XMLHTTP是一组API函数集,可被JavaScript、JScript、VBScript以及其它web浏览器内嵌的脚本语言调用,通过HTTP在浏览器和web服务器之间收发XML或其它数据。XMLHTTP最大的好处在于可以动态地更新网页,它无需重新从服务器读取整个网页,也不需要安装额外的插件。该技术被许多网站使用,以实现快速响应的动态网页应用。例如:Google的Gmail服务、Google Suggest动态查找界面以及Google Map地理信息服务。XMLHTTP是AJAX网页开发技术的重要组成部分,除XML之外,XMLHTTP还能用于获取其它格式的数据,如JSON或者甚至纯文本。XMLHTTP的实现有两种,分别是:

       1、ActiveXObject:

        Microsoft ActiveX控件是由软件提供商开发的可重用的软件组件。使用ActiveX控件,可以很快地在网址、台式应用程序、以及开发工具中加入特殊的功能。例如,StockTicker控件可以用来在网页上即时地加入活动信息,动画控件可用来向网页中加入动画特性。一般只有IE5和IE6才使用ActiveXObject。创建ActiveXObject对象的方法为:

var http = new ActiveXObject(servername.typename[, location])

       其中:servername是提供对象的应用程序名称,typename是要创建的对象的类型,location(非必选项)是要在其中创建对象的网络服务器的名称。

       2、XMLHttpRequest:

        XMLHttpRequest是一个JavaScript对象,它最初由微软设计,随后被Mozilla、Apple和Google采纳。如今该对象已经被W3C组织标准化,通过它你可以很容易的取回一个URL上的资源数据。尽管名字里有XML,但XMLHttpRequest可以取回所有类型的数据资源,并不局限于XML,而且除了HTTP,它还支持FILE和FTP协议。XMLHttpRequest在AJAX中被大量使用,目前主流浏览器都支持XMLHttpRequest。创建XMLHttpRequest对象的方法为:

var http = new XMLHttpRequest();

三、XMLHttpRequest使用:

        现在所有浏览器均支持XMLHttpRequest,但IE5和IE6使用的是ActiveXObject。为了在不同的浏览器中创建XMLHttpRequest对象,可以使用如下兼容:

var http;
if (typeof XMLHttpRequest != "undefined") {
    http = new XMLHttpRequest();
} else {
    var versions = ["Msxml2.XMLHttp.5.0", "Msxml2.XMLHttp.4.0", 
        "Msxml2.XMLHttp.3.0", "Msxml2.XMLHttp", "Microsoft.XMLHttp"];
    for (var i = 0; i < versions.length; i++) {
        try {
            http = new ActiveXObject(versions[i]);
            break;
        } catch (e) {}
    }
}

        1、XMLHttpRequest(简称xhr)对象常用属性有:

                    1>readyState:表示HTTP请求的状态,当一个XMLHttpRequest初次创建时,这个属性的值从0开始,直到接收到完整的HTTP响应,这个值增加到4。readyState的值不会递减,除非当一个请求在处理过程中的时候调用了abort()或open()方法。每次这个属性的值增加的时候,都会触发onreadystatechange事件句柄。5个状态中每一个都有一个相关联的非正式的名称,状态、名称和含义如下:

状态描述
0Uninitialized (已初始化)XMLHttpRequest对象已创建或已被abort()方法重置。
1Open(已打开)open()方法已被成功调用,send()方法还未被调用
2Sent(已发送)send()方法已经被调用,HTTP请求已发送到Web服务器,未接收到响应。
3Receiving(正在接收)所有响应头部都已经接收到,响应体开始接收但未完成。
4Loaded(已完成)HTTP 响应已经完全接收。

                    2>status:由服务器返回的HTTP状态代码,如200表示成功,而404表示 "Not Found" 错误。当readyState小于3的时候读取这一属性会导致异常。

                    3>statusText:这个属性用名称而不是数字指定了请求的HTTP的状态代码。也就是说,当状态为200的时候它是 "OK",当状态为 404的时候它是 "Not Found"。和status属性一样,当readyState小于3的时候读取这一属性会导致异常。

                    4>responseType:是xhr level 2新增的属性,用来指定response的数据类型,目前还存在些兼容性问题。支持的数据类型有:

数据类型说明

""

String字符串

在不设置responseType时的默认值

"text"

String字符串 

"document"

Document对象

希望返回XML格式数据时使用

"json"

javascript对象

存在兼容性问题,IE10/IE11不支持

"blob"

Blob对象

 

"arrayBuffer"

ArrayBuffer对象

 

                    5>responseText:只有当responseType为"text"或""时,xhr对象上才有此属性。表示从服务器接收到的响应体(不包括头部),如果还没有接收到数据的话,就是空字符串。如果 readyState小于3,这个属性就是一个空字符串。当readyState为3,这个属性返回目前已经接收的响应部分。如果readyState为 4,这个属性保存了完整的响应体。如果响应包含了为响应体指定字符编码的头部,就使用该编码。否则,默认使用Unicode UTF-8。

                    6>responseXML:只有当responseType为"text"、""或"document"时,xhr对象上才有此属性。表示从服务器接收到的响应体(不包括头部),解析为XML并作为Document对象返回。

                    7>timeout:表示一个请求在被自动终止前所消耗的毫秒数。默认值为0,意味着没有超时时间。超时并不能应用在同步请求中,否则会抛出一个InvalidAccessError异常。当发生超时时,timeout 事件将会被触发。

                    8>withCredentials:表明在进行跨站(cross-site)的访问控制(Access-Control)请求时,是否使用认证信息 (例如cookie或授权的header)。默认为 false。注意:这不会影响同站same-site请求。

        2、XMLHttpRequest对象常用方法有:

                    1>open(method,url,async,username,password):用于打开连接请求,其中:

                    method:用于设置请求的类型(GET、POST、PUT或DELETE等),如果method不是有效的值将会抛出SyntaxError异常,如果method为CONNECT、TRACE或TRACK(不区分大小写)将会抛出SecurityError异常。如果method为GET,则send()中参数只能为null;

                    url:用于设置请求文件在服务器上的位置,为了避免得到的数据是缓存的结果,最好在url的最后加一个key=value形式的随机数作为参数,并用?连接,例如:"/project/test.php?rand=" + Math.random(),如果url不能被成功解析将会抛出SyntaxError异常;

                    async:用于设置是否要异步请求(true或false,默认为true,如果为false,则send()方法不会返回任何东西,直到接收到服务器的返回数据,timeout必须为0,withCredentials必须为false,responseType必须为"",置为"text"也不允许),如果要用于AJAX的话,async必须是true;

                    username:用于设置授权的用户名;

                    password:用于设置授权的密码。

                    示例:

var http = new XMLHttpRequest();
http.open("GET","/project/test.php?rand=" + Math.random(),true);

                    2>setRequestHeader(key,value):设置HTTP请求头信息,调用此方法时必须确保已经调用open()方法打开了一个URL。示例:

var http = new XMLHttpRequest();
http.open("POST","/project/test.php?rand=" + Math.random(),true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");

                    3>overrideMimeType(mimeType) :用于重写由服务器返回的MIME类型,这个方法必须确保send()已被调用。MimeType即对应资源的媒体类型,通常是通过HTTP协议,由Web服务器告知浏览器,更准确地说是通过响应报文的Header头的Content-Type属性来指定的,媒体类型对照表参考:https://blog.csdn.net/lzghxjt/article/details/50493026。示例:

var http = new XMLHttpRequest();
http.open("POST","/project/test.php",true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.overrideMimeType("text/plain; charset = utf-8");

                    4>send(obj):将请求发送到服务器,发送的obj参数类型可以是ArrayBuffer、Blob、Document、DOMString和FormData,参数类型不同,会导致请求Header中默认的Content-type不同。如果该请求是异步模式,则该方法会立刻返回。相反如果请求是同步模式,则直到请求的响应完全接收以后,该方法才会返回。需要特别注意的是:所有相关的事件绑定必须在调用send()方法之前进行。示例:

var http = new XMLHttpRequest();
http.open("POST","/project/test.php",true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.overrideMimeType("text/plain; charset = utf-8");
var form = document.getElementById("info");
http.send(serialize(form));

                    5>sendAsBinary() :发送二进制的send()方法的变种。

                    6>abort():如果请求已经被发送,则立刻中止请求。当资源加载已中止时,也会触发abort()事件。

                    7>getAllResponseHeaders():返回所有响应头信息(响应头名和值),如果响应头还没有接收,则返回null。注意:使用该方法获取的response headers与在开发者工具 Network 面板中看到的响应头不一致。

                    8>getResponseHeader() :返回指定响应头的值,如果响应头还没有被接收,或该响应头不存在,则返回 null。注意:使用该方法获取某些响应头时,浏览器会抛出异常,具体原因如下:

                           ①W3C的xhr标准中做了限制,规定客户端无法获取response中的Set-Cookie、Set-Cookie2这2个字段,无论是同域还是跨域请求;

                           ②W3C的cors标准对于跨域请求也做了限制,规定对于跨域请求,客户端允许获取的response header字段只限于"simple response header"和"Access-Control-Expose-Headers(服务器允许暴露给客户端访问的Header)", 常见的"simple response header"有:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified和Pragma。

                    9>onreadystatechange():onreadystatechange事件会在xhr.readyState属性发生变化时触发。示例:

var http = new XMLHttpRequest();
http.open("POST","/project/test.php",true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.overrideMimeType("text/plain; charset = utf-8");
var form = document.getElementById("info");
http.send(serialize(form));
http.onreadystatechange = function(){
  if (http.readyState == 4 && http.status == 200) {
     alert(http.responseText);
  } else {
     alert(http.statusText);
  }
};

                    10>loadstart:当程序开始加载时,loadstart事件将被触发。

                    11>progress:进度事件会被触发用来指示一个操作正在进行中。

                    12>error:当一个资源加载失败时会触发error事件。

                    13>load :当一个资源及其依赖资源已完成加载时,将触发load事件。

                    14>timeout:当进度由于预定时间到期而终止时,会触发timeout事件。

                    15>loadend:当一个资源加载进度停止时 (例如,在已经分派“错误”,“中止”或“加载”之后),触发loadend事件。

        3、XMLHttpRequest的版本:

                    1>XMLHttpRequest Level 1:

                            XMLHttpRequest对象的主要属性有:

                                    ①readyState: XMLHttpRequest对象的状态;

                                    ②status:服务器返回的状态码,等于200表示一切正常;

                                    ③responseText:服务器返回的文本数据;

                                    ④statusText:服务器返回的状态文本。

                            XMLHttpRequest Level 1的缺点:

                                    ①只支持文本数据的传送,无法用来读取和上传二进制文件;

                                    ②传送和接收数据时,没有进度信息,只能提示有没有完成;

                                    ③受到"同域限制"(Same Origin Policy),只能向同一域名的服务器请求数据;

                    2>XMLHttpRequest Level 2:

                            在XMLHttpRequest Level 1的基础上做了如下改进:

                                    ①可以设置HTTP请求的超时时间;

                                    ②可以使用FormData对象(HTML5新增的对象)管理表单数据;

                                    ③可以上传文件;

                                    ④可以请求不同域名下的数据(跨域请求);

                                            CORS跨域资源共享(全称:Cross-origin resource sharing):新版本的XMLHttpRequest对象,可以向不同域名的服务器发出HTTP请求,这叫做 "跨域资源共享"。如果本域名需要跨域访问远程某一域名,需要在该远程域名所在的服务器的Access-Control-Allow-Origin设置本域名。

                                    ⑤可以获取服务器端的二进制数据;

                                    ⑥可以获得数据传输的进度信息。

                           

参考:http://www.runoob.com/ajax/ajax-tutorial.html

           https://www.jianshu.com/p/22f82be980fb

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值