2 AJAX(封装+调用 )

AJAX定义
主要思路
兼容IE
监听【异步对象】状态变化

1.AJAX定义:不重新加载页面,更新页面的数据(例如搜索框)

2.主要思路:

**主流程:**
1.引入AJAX
2.添加:请求方式,请求地址,请求参数,发送
3.判断请求过程码,判断请求状态码
4.监听数据
5.设置过期时间

**附属功能:**
1.封装时:兼容IE
2.封装时:转化调用type大小写问题
1.调用时:将参数分开,在封装函数设拼接
3.调用时:处理实参位置前后
4.调用时:监听XML格式 / JSON格式

3.兼容ie

1.引入AJAX异步对象:
位置:写在最上方
定义:低版本ie浏览器在创建ajax异步对象时,需要在w3c复制粘贴代码
代码:「ajax-XHR-创建对象-拉到最下面」
2.GET方式:请求地址:
位置:封装新的函数
定义:让每次get访问请求地址都不一样
理由:IE浏览器中缓存因素,IE认为ie认为AJAX返回get地址===【第一次】返回的服务器内容

/代码
随机数Math.random()
当前时间new Date.getTime()

4.监听【异步对象】状态变化

请求状态代码
请求未初始化readState===0
服务器连接已建立readState===1
请求已接收readState===2
请求处理中readState===3
请求已完成,且响应已就绪readState===4

在这里插入图片描述

//⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️
//0.处理2中请求参数问题
//实现功能:因调用时方便,参数和url分开,需要在此处拼接
//实现功能:处理参数可能出现的中文情况
//实现功能:处理IE浏览器兼容问题:(具体问题文档,需要每次给路径拼接不同的内容)
function obj2str(data) {
  //(1)给json格式参数设置新的key为t,value为随机数,最后会一起拼接,解决兼容问题
  data.t = new Date.getTime();
  //(2)设置空数组
  var lzy = [];
  //(3)循环传递进来的key=value格式内容
  for (var key in data) {
    //(4)数组的push方法:用等号拼接key和value
    //(5)通过encodeURIComponent方法将key和value转化为乱码,防止出现中文
    lzy.push(encodeURIComponent(key) + "=" + encodeURIComponent(data[key]));
  }
  //(6)数据方法:数组转化为字符串,用&拼接
  return lzy.join("&");
}

//⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️

function ajax(potion) {
  //0.调用外部函数,处理2中请求路径
  var str = obj2str(option.data);

  //1.创建ajax异步对象
  //隶属1:兼容ie浏览器创建ajax异步对象代码
  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");
  }

  //2判断是get还是post,然后设置请求方式,请求地址,请求参数存放位置,发送;
  if (option.type.toLowerCase() == "get") {
    //toLowerCase()方法是转化成小写
    //设置请求方式,请求地址,请求参数:需要外部引用函数拼接解决问题,永远是true[true为异步请求函数]
    xmlhttp.open("GET", option.url + "?" + str, true);
    //发送请求
    xmlhttp.send(); //GET时为空,请求参数在路径上
  } else if (option.type.toLowerCase() == "post") {
    //toLowerCase()方法是转化小大写
    //设置请求方式,请求地址
    xmlhttp.open("POST", option.url, true);
    // POST发送时默认规定的一行代码
    xmlhttp.setRequestHeader(
      "Content-type",
      "application/x-www-form-urlencoded"
    );
    //发送请求+请求参数
    xmlhttp.send(str);
  }

  //3.监听听【异步对象】状态变化
  xmlhttp.onreadystatechange = function () {
    //只要状态发生变化就会调用回调函数,请求状态:文档
    if (xmlhttp.readState === 4) {
      clearInterval(timer); //关掉定时器,处理6的 [往回问题]
      if (
        (xmlhttp.status >= 200 && xmlhttp.status < 300) ||
        xmlhttp.status == 304
      ) {
        //判断服务器返回的状态吗
        //4.处理返回结果,写在3内
        //(1)success, error为行参数,实参为函数代码,通过闭包在函数调用处写成功/失败代码,例如弹出
        //(2)实时接收服务器返回结果,res.end或者echo的值,格式为json格式数据或者字符串
        option.success(xmlhttp);
      } else {
        //(1)success, error为行参数,实参为函数代码,通过闭包在函数调用处写成功/失败代码,例如弹出
        //(2)实时接收服务器返回结果,res.end或者echo的值,格式为xml格式数据或者字符串
        option.error(xmlhttp);
      }
    }
  };
  //5.设置响应超时功能:超过参数300秒时关掉【3.发送请求】
  var timer; //设置变量做定时器
  if (option.timeout) {
    //判断是否有实参超时时间,如果有超时时间
    timer = setInterval(function () {
      //开启定时器,经过xx秒后运行,关掉请求和定时器,参数在setInterval方法最后
      xmlhttp.abort(); //中断请求方法
      clearInterval(timer); //关掉定时器
    }, option.timeout);
  }
}

//⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️

ajax({
  type: "get",
  url: "test1.txt",
  data: {
    //调用ajax时传递参数时分开
    key: "value",
    key: "value",
  },
  timeout: 3000, //设置超时时间
  success: function (xhr) {
    var lzy2 = xmlhttp.responseText; //将服务器运行结果返回到前台js文件(实时)
    var lzy3 = xmlhttp.responseXML; //将XML文件内json格式键值对传递给前台js文件(实时)
    alert(xhr.responseText); //服务器返回的数据弹出
  },
  error: function (xhr) {
    alert("调用失败" + xmlhttp.status);
  },
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值