Tian Jiale's Blog

JavaScript 中 AJAX 的使用

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

AJAX 不需要任何浏览器插件,但需要用户允许 JavaScript 在浏览器上执行。

原生 js

GET1

const result = document.getElementById('res');
//创建对象
const xhr = new XMLHttpRequest();
//设置请求方法和url
xhr.open('GET', 'http://localhost:8000/server');
//发送
xhr.send();
//事件绑定 处理服务端返回的结果
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    //服务端返回了所有结果
    if (xhr.status >= 200 && xhr.readyState <= 300) {
      //2开头的都表示成功
      //处理结果
      console.log(xhr.status); //状态码
      console.log(xhr.statusText); //状态字符串
      console.log(xhr.getAllResponseHeaders); //所有响应头
      console.log(xhr.response); //响应体
      result.innerHTML = xhr.response;
    } else {
    }
  }
};

POST1

const result = document.getElementById('res');
const xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:8000/server');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('a=100&b=200&c=3');
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if (xhr.status >= 200 && xhr.status < 300) {
      result.innerHTML = xhr.response;
    }
  }
};

设置响应体格式

const result = document.getElementById('res');
const xhr = new XMLHttpRequest();
//设置响应体数据的类型
xhr.responseType = 'json';
xhr.open('GET', 'http://localhost:8000/json-server');
xhr.send();
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if (xhr.status >= 200 && xhr.status < 300) {
      //自动转换
      console.log(xhr.response);
      result.innerHTML = xhr.response.name;
    }
  }
};

IE 缓存问题

在 url 路径上加上 t = Date.now()

超时与网络异常

const result = document.getElementById('res');
const xhr = new XMLHttpRequest();
//超时设置
xhr.timeout = 2000;
//超时回调
xhr.ontimeout = function () {
  alert('网络异常,建议换台电脑');
};
//网络异常回调
xhr.onerror = function () {
  alert('你的网络异常');
};
xhr.open('GET', 'http://localhost:8000/delay');
xhr.send();
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if (xhr.status >= 200 && xhr.status < 300) {
      result.innerHTML = xhr.response;
    }
  }
};

取消请求

let xhr = null;
xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:8000/delay');
xhr.send();
// 取消请求
xhr.abort();

重复请求

设置节流阀,不发送新请求;设置请求状态变量,取消原请求,发送新请求。

jQuery

GET2

$.get(
  "http://localhost:8000/jquery-server",
  { a: 100, b: 200 },
  function (data) {
    console.log(data);
  },
  "json"
);

POST2

$.post("http://localhost:8000/jquery-server",{ a: 100, b: 200 }, function (data) {
  console.log(data);
});

AJAX

$.ajax({
  //url
  url: 'http://localhost:8000/jquery-server',
  //参数
  data: { a: 100, b: 222 },
  //请求类型
  type: 'GET',
  //响应体结果
  dataType: 'json',
  //成功的回调
  success: function (data) {
    console.log(data);
  },
  //超时时间
  timeout: 2000,
  //失败的回调
  error: function () {
    console.log('出错了');
  },
  //头信息设置
  headers: {
    c: 300,
    d: 400,
  },
});

axios

GET3

axios
  .get('http://localhost:8000/axios-server', {
    //url参数
    params: {
      id: 1000,
      vip: 12,
    },
    //请求头信息
    headers: {
      name: 'hanser',
      age: '2',
    },
  })
  .then((value) => {
    console.log(value);
  });

POST3

axios.post(
  'http://localhost:8000/axios-server',
  //请求体
  {
    username: 'admin',
    password: '123',
  },
  {
    //url参数
    params: {
      id: 1,
      vip: 123,
    },
    //请求头参数
    headers: {
      name: 'yousa',
      age: '23',
    },
  }
);

axious

axios({
  method: 'POST',
  url: 'http://localhost:8000/axios-server',
  //url参数
  params: {
    vip: 10,
    id: 123,
  },
  //头信息
  headers: {
    a: 100,
    b: 200,
  },
  //请求体参数
  data: {
    name: 'hanser',
    age: '7',
  },
}).then((response) => {
  console.log(response);
});

fetch

fetch('http://localhost:8000/fetch-server', {
  //请求方法
  method: 'POST',
  //请求头
  headers: {
    name: 'hanser',
  },
  //请求体
  body: 'name=admin&pd=admin',
})
  .then((Response) => {
    console.log(Response);
    return Response.text();
  })
  .then((Response) => {
    console.log(Response);
  });

跨域 CORS

设置 http 响应的响应头

Access-Control-Allow-Origin:允许请求的源地址

设置为*则为不限制跨域请求。