var xmlhttp;
if (window.XMLHttpRequest) {
    // code for IE7+,Firefox,Chrome,Opera,Safari
    xmlhttp = new XMLHttpRequest();
} else {
    // code for IE6,IE5  
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
        // to do...
    }
}
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();

步骤:

1、创建。

创建 XMLHttpRequest 对象的语法:

var = new XMLHttpRequest();

老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:

var = new ActiveXObject("Microsoft.XMLHTTP");

2、连接和发送。

  • 2.1、open()函数的三个参数:请求方式、请求地址、是否异步请求
  • 2.2、GET 请求方式是通过URL参数将数据提交到服务器的,POST则是通过将数据作为 send 的参数提交到服务器
  • 2.3、POST 请求中,在发送数据之前,要设置表单提交的内容类型
  • 2.3、提交到服务器的参数必须经过 encodeURIComponent() 方法进行编码,实际上在参数列表key=value的形式中,keyvalue 都需要进行编码,因为会包含特殊字符。每次请求的时候都会在参数列表中拼入一个 v=xx 的字符串,这样是为了拒绝缓存,每次都直接请求到服务器上。

3、接收。

  • 3.1、接收到响应后,响应的数据会自动填充XHR对象,相关属性如下

responseText:响应返回的主体内容,为字符串类型;
responseXML:如果响应的内容类型是 "text/xml""application/xml",这个属性中将保存着相应的xml 数据,是 XML 对应的 document 类型;
status:响应的HTTP状态码;
statusTextHTTP状态的说明

  • 3.2、XHR对象的readyState属性表示请求/响应过程的当前活动阶段,这个属性的值如下
    • 0 --> 未初始化,尚未调用open()方法;
    • 1 --> 启动,调用了open()方法,未调用send()方法;
    • 2 --> 发送,已经调用了send()方法,未接收到响应;
    • 3 --> 接收,已经接收到部分响应数据;
    • 4 --> 完成,已经接收到全部响应数据;

只要 readyState 的值变化,就会调用 readystatechange 事件,(其实为了逻辑上通顺,可以把readystatechange放到send之后,因为send时请求服务器,会进行网络通信,需要时间,在send之后指定readystatechange事件处理程序也是可以的,我一般都是这样用,但为了规范和跨浏览器兼容性,还是在open之前进行指定吧)。

  • 3.3、在readystatechange事件中,先判断响应是否接收完成,然后判断服务器是否成功处理请求,xhr.status 是状态码,状态码以2开头的都是成功,304表示从缓存中获取,上面的代码在每次请求的时候都加入了随机数,所以不会从缓存中取值,故该状态不需判断。

封装ajax方法:

ajax({     
        url: "./test.PHP",type: "POST",data: { name: "abc",age: 18 },dataType: "json",success: function (response,xml) {         
            // 执行成功回调      
        },fail: function (status) {         
            // 执行失败回调      
        }
    });
     
     function ajax(options) {    
         options = options || {};    
         options.type = (options.type || "GET").toupperCase();      
         options.dataType = options.dataType || "json";        
         var params = formatParams(options.data);               
         
         // 创建对象       
         if (window.XMLHttpRequest) {         
             var xhr = new XMLHttpRequest();    
         } else {           
             var xhr = new ActiveXObject('Microsoft.XMLHTTP');      
         }    
         
         //接收 - 第三步
         xhr.onreadystatechange = function () {          
             if (xhr.readyState == 4) {              
                 var status = xhr.status;             
                 if (status >= 200 && status < 300) {                    
                     options.success && options.success(xhr.responseText,xhr.responseXML);               
                 } else {                   
                     options.fail && options.fail(status);               
                 }          
             }
         }      
             
         //连接 和 发送 - 第二步    
         if (options.type == "GET") {         
             xhr.open("GET",options.url + "?" + params,true);            
             xhr.send(null);      
         } else if (options.type == "POST") {           
             xhr.open("POST",options.url,true);            
             //设置表单提交时的内容类型            
             xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
             xhr.send(params);       
         }     
         
         //格式化参数  
         function formatParams(data) {    
             var arr = [];       
             for (var name in data) {            
                 arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));  
             }        
             arr.push(("v=" + Math.random()).replace(".",""));      
             return arr.join("&");  
         }

Ajax原理及代码封装的更多相关文章

  1. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  2. Swift 语言指南

    想快速找到优秀开源项目的开发者,可以访问我们额外整理的《Swift项目精选》。希望快速找到其中精选文章,可以访问《Swift文章精选》。其中包括:Swift概括,SwiftProgrammingLanguage,UsingSwiftwithCocoaandObjective-C2.SwiftProgrammingLanguage苹果官方文档:在线版(英文)|iBooks版(英文)爱好者翻译版:在线版(中文)By@Swift中文翻译组|PDF版By@老码团队|百度阅读版相关文档BasicOperators-

  3. SWIFT闭包,介绍,使用ALAMOFIRE封装 异步请求

    闭包说明:首先说明简明扼要的说明一下:闭包,可以看做JAVA中匿名函数。

  4. swift开源项目精选已经造好的轮子

    Swift开源项目精选站在个人的角度,并基于《Swift语言指南》,针对开源项目做了一个甄别、筛选。当然,由于个人能力及涉足范围所限,还远远不够,其中肯定有偏颇及不足,还望同学们多多见谅。更希望能得到你的帮助和补充,共同参与。@SwiftLanguage更新至2016-2-1,最近新收录Graph,Localize-Swift,Cuckoo,Gecco,AudioKit,vapor,Every.swift等7个,合计已收录297个。

  5. Swift 简单封装UISwipeGestureRecognizer + 闭包回调监听事件,便于不同场景的 UIView调用

    下面就是我们的UIView源文件调用啦:是的,就是这么简单。。手势不是目的,封装不是目的,目的是学会用闭包实现数据监听及传送数据。

  6. Swift 开源项目精选-v1.0

    转自http://dev.swiftguide.cn/archive/featured-open-source-projects-in-swift_v1.0.html目录工具存储网络图片框架界面示例应用工具SwiftyJSONBytangplin,lingoer:GitHub上最为开发者认可的JSON解析库ArgoBythoughtbot:函数式JSON解析库JSONCodableByMatthe

  7. Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire

    升级到Swift3.0之后,新版本的Alamofire只支持iOS9.0以上的系统,如果要适配iOS8,需要自己封装URLSession,下面是笔者的方案:这里使用的是Swift自己的原生类型URLSession,而不是NSURLSession。所有重载版本的request方法最后都会返回一个DataRequest类型,这个DataRequest是Alamofire封装的request对象,绕的有点晕。

  8. Swift3.0服务端开发(五) 记事本的开发iOS端+服务端

    前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架。本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在《Swift3.0服务端开发(一)》这篇博客中已经简单的介绍过了,本篇博客就来详细的聊一下这个工程的具体实现细节。当然包括iOS端和服务端的代码。关于Swift3.0连接和操作MysqL的详细内容请参考上一篇博客《Swift3.0服务端开发(四)MysqL数据库的连接与操作》,数据库的连接在本部分就不做过多赘述了。

  9. swift 学习资料大全

    refresher-swift,上拉和下拉刷新。ReplaceAnimation.swift-基于@ZeeYoung欧阳哲同学的创意下拉刷新动画实现。源码分析pull-to-refresh.swift-是一款非常易于开发者使用的下拉刷新和加载更多组件。Neon.swift-功能强大的UI布局神器。EasyPeasy.swift-编程方式自动布局框架库。富文本@RichEditorView-swift,一套可定制富文本编辑器组件及示例。Splitflap.swift-可用于快速给iOS应用创建文字翻转的动画

  10. android – Phonegap本地构建 – jquery ajax错误:readystate 0 responsetext status 0 statustext error

    解决方法您是否在索引文件中包含了内容安全元标记?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部