• ajax温习


    工作中一直有写JS,也一直有用jquery,在感受jquery便利之余,也对它产生了依赖,已至于许多功能只知使用而不知原生写法,就像ajax。

    今天不小心翻看了以前学习的视频,温故了一下原生ajax写法及原理,正好捣鼓捣鼓。这也是面试经常会遇到的问题,动手封装下原生的ajax函数何乐而不为了,代码如下:

    function ajaxfn(obj){
                /*传入一个json对象
                 *type:为请求方式,如get,post
                 *data:传输的数据
                 *async:异步请求,默认为true
                 *dataType:返回的数据类型
                 *url:这请求地址
                 *fnok:为请求成功时的回调,默认传入返回的数据
                 *fnerror:为请求失败的回调,默认传入当前的服务器状态码,如500,404
                */
                var xhr=null,
                    type=obj.type?obj.type.toLowerCase():"get",//默认是get
                    url=obj.url,
                    data=obj.data?JSON.stringify(obj.data):null,
                    dataType=obj.dataType?obj.dataType.toLowerCase():"text",
                    async=true;//默认是异步
                    if(obj.async==false){
                        async=false;
                    }
                //创建XMLHttpRequest对象
                try{
                    xhr=new XMLHttpRequest();
                }catch(e){
                    //兼容ie6
                    xhr=new ActiveXObject('Microsoft.XMLHTTP');
                }
                //连接服务器
                xhr.open(type,url,async);
                //发送请求
                if(type=="post"){//如果是post请求得先设置请求头,application/x-www=form-urlencoded适合绝大多数的应用场景
                    xhr.setRequestHeader("content-type","application/x-www=form-urlencoded");
                }
                xhr.send(data);
                //监听过程
                xhr.onreadystatechange=function(){
                    /*readyState请求状态
                     *0:请求未初始化(还没有调用open())
                     *1:请求已经建立,但是还没有发送(还没有调用send())
                     *2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。
                     *3:请求处理中,通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
                     *4:响应已经完成;可以获取并使用服务器的响应了.
                    */
                    if(xhr.readyState==4){//请成完成
                        /*常用http状态码
                         *200:服务器成功返回网页
                         *304:未修改,使用缓存
                         *403:服务器拒绝请求
                         *404:请求的网页不存在
                         *503:服务器暂时不可用
                         *500:服务器内部错误
                        */
                        if(xhr.status==200){//返回成功                        
                            switch (dataType){
                                case "text"://接收到字符串
                                    obj.fnok && obj.fnok(xhr.responseText);
                                    break;
                                case "json"://接收到json字符串数据
                                    obj.fnok && obj.fnok(JSON.parse(xhr.responseText));
                                    break;
                                case "xml"://接收到xml格式数据
                                    obj.fnok && obj.fnok(xhr.responseXML);
                                    break;
                            }
                        }else{
                            obj.fnerror && obj.fnerror(xhr.status);
                        }
                    }
                }
            }
        }
    View Code

    注:为了兼容IE6,ie7,ie8(兼容模式)支持JSON对象的stringify(),parse()方法,引入了一个json2.js文件,文件下载地址如下:https://github.com/douglascrockford/JSON-js

    使用示例如下:

    ajaxfn({
            type:'get',//请求方式
            url:'test.txt',//请求地址
            dataType:'text',//返回的数据类型
            fnok:function(data){//请求成功的回调
               alert(data);
            },
            fnerror:function(data){//请求失败的回调
               alert(data);
            }
    });

    个人知识有限,如有错误的地方,望指正,共同学习共同进步!

  • 相关阅读:
    软件测试职业规划(初版)
    http-server简易的HTTP服务解决数据传输问题
    moco框架的使用
    sublime3安装部署及插件安装
    Tomcat下载部署及解决中文乱码显示
    Linux磁盘管理
    DVWA学习记录 PartⅨ
    DVWA学习记录 PartⅧ
    DVWA学习记录 PartⅦ
    DVWA学习记录 PartⅥ
  • 原文地址:https://www.cnblogs.com/xwwin/p/4805993.html
Copyright © 2020-2023  润新知