04.封装ajax

  1 <script>
  2       //封装ajax
  3       //  函数名 ajax
  4       //  函数的参数
  5       // url: 请求的地址
  6       // type: 请求的方式 get /post
  7       // data: 要上传的数据 要求是键值对的形式
  8       //  函数的返回值 没有返回值
  9 
 10       // 增加的功能:
 11       // 1. 如果没有传请求的地址,就没有必要执行后面的代码
 12       // 2. 默认是get, 如果传post,则发post请求
 13       // 3. 不需要再上传键值对的字符串了name=zs&age=18&sex=m
 14       // 而是上传一个对象
 15       // {
 16       //   name: 'zs',
 17       //   age: 18,
 18       //   sex: 'm'
 19       // }
 20       //  优化前: 参数列表的问题: 如果记不住顺序,那么传参会错误.少些参数,也会错误
 21       //  优化后: 传入一个对对象. 不需要考虑顺序. 少写type,函数照样可以正常运行
 22       // option要求是一个对象
 23       // option.url
 24       // option.type
 25       // option.data
 26 
 27       // 最后一个功能:
 28 
 29       ajax({
 30         url: '../test.php',
 31         type: 'post',
 32         data: {
 33           name: 'zs'
 34         },
 35         success: function(res) {
 36           //当数据成功的响应回来,那么这个函数会自动被调用
 37           // 而且,希望将获取到的数据,传入到这个回调函数中
 38           // alert('响应成功了');
 39           console.log(res);
 40           // JSON.parse(res)
 41         }
 42       });
 43       function ajax(option) {
 44         //判断是否传入对象,
 45         if (option.constructor !== Object) {
 46           console.log('对象');
 47           return;
 48         }
 49 
 50         //获取参数
 51         var url = option.url;
 52         var type = option.type;
 53         var data = option.data;
 54 
 55         //功能 1  没有传url  return
 56         if (!url) {
 57           return;
 58         }
 59         //功能 2 请求类型
 60         type = type === 'post' ? 'post' : 'get';
 61         //功能 3 将 data 从对象转成 用 & 隔开的键值对的 字符串
 62         var arr = [];
 63         for (var k in data) {
 64           arr.push(k + '=' + data[k]);
 65         }
 66         data = arr.join('&');
 67 
 68         //1.创建对象
 69         var xhr = new XMLHttpRequest();
 70         //2.设置请求行
 71         if (type === 'get') {
 72           url += '?' + arr;
 73           data = null;
 74         }
 75         xhr.open(type, url);
 76         //3.设置请求头
 77         if (type === 'post') {
 78           xhr.setRequestHeader(
 79             'content-type',
 80             'application/x-www-form-urlencoded'
 81           );
 82         }
 83         //4.设置请求主体并发送请求
 84         xhr.send(data);
 85         //5.接收响应
 86         xhr.onreadystatechange = function() {
 87           if (xhr.readyState == 4 && xhr.status == 200) {
 88             var result = xhr.responseText;
 89             if (xhr.getResponseHeader('content-type').indexOf('json') != -1) {
 90               var obj = JSON.parse(result);
 91               option.success & option.success(obj);
 92             } else if (
 93               xhr.getResponseHeader('content-type').indexOf(xml) != -1
 94             ) {
 95               option.success && option.success(xhr.responseXML);
 96             } else {
 97               option.success && option.success(result);
 98             }
 99           } else {
100             //失败
101             option.error && option.error();
102           }
103         };
104       }
105     </script>

 

posted @ 2019-04-17 23:39  fiveNuts  阅读(135)  评论(0编辑  收藏  举报