1. /**
  2. * 处理 data参数
  3. * @prarm {data}需要发送到服务器的数据
  4. * @returns{string} 返回拼接好的查询字符串 k=v&v=k
  5. */
  6. function resolveData(data) {
  7. var arr = [];
  8. for (const k in data) {
  9. var str = `${k}=${data[k]}`;
  10. arr.push(str);
  11. }
  12. return arr.join("&");
  13. }
  14. function itheima(option) {
  15. var xhr = new XMLHttpRequest();
  16. // 将外界传进来的参数对象转为查询字符串
  17. var qs = resolveData(option.data);
  18. if ((option.method.toUpperCase() === "GET")) {
  19. // 发起GET请求
  20. // xhr.open(option.method, option.url + '?' + qs)
  21. xhr.open(option.method, qs ? option.url + "?" + qs : option.url);
  22. xhr.send();
  23. } else if (option.method.toUpperCase() === "POST") {
  24. //发起POST请求
  25. xhr.open(option.method, option.url);
  26. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  27. xhr.send(qs);
  28. }
  29. // 注册监听
  30. xhr.onreadystatechange = function () {
  31. if (xhr.readyState === 4 && xhr.status === 200) {
  32. var result = JSON.parse(xhr.responseText);
  33. option.success(result);
  34. }
  35. };
  36. }

定义options参数选项

itheima() 函数是我们自定义的 Ajax 函数,它接收一个配置对象作为参数,配置对象中可以配置如下属性:

  • method 请求的类型
  • url 请求的 URL 地址
  • data 请求携带的数据
  • success 请求成功之后的回调函数

处理data参数

需要把 data 对象,转化成查询字符串的格式,从而提交给服务器,因此提前定义 resolveData 函数如下:

  1. /**
  2. * 处理 data参数
  3. * @prarm {data}需要发送到服务器的数据
  4. * @returns{string} 返回拼接好的查询字符串 k=v&v=k
  5. */
  6. function resolveData(data) {
  7. var arr = [];
  8. for (const k in data) {
  9. var str = `${k}=${data[k]}`;
  10. arr.push(str);
  11. }
  12. return arr.join("&");
  13. }

定义itheima函数

在 itheima() 函数中,需要创建 xhr 对象,并监听 onreadystatechange 事件:

  1. function itheima(option) {
  2. var xhr = new XMLHttpRequest();
  3. // 将外界传进来的参数对象转为查询字符串
  4. var qs = resolveData(option.data);
  5. // 注册监听
  6. xhr.onreadystatechange = function () {
  7. if (xhr.readyState === 4 && xhr.status === 200) {
  8. var result = JSON.parse(xhr.responseText);
  9. option.success(result);
  10. }
  11. };
  12. }

判断请求的类型

不同的请求类型,对应 xhr 对象的不同操作,因此需要对请求类型进行 if … else … 的判断:

  1. if ((option.method.toUpperCase() === "GET")) {
  2. // 发起GET请求
  3. // xhr.open(option.method, option.url + '?' + qs)
  4. xhr.open(option.method, qs ? option.url + "?" + qs : option.url);
  5. xhr.send();
  6. } else if (option.method.toUpperCase() === "POST") {
  7. //发起POST请求
  8. xhr.open(option.method, option.url);
  9. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  10. xhr.send(qs);
  11. }