HarleyWang93 / learning

学习
7 stars 0 forks source link

AJAX #24

Open HarleyWang93 opened 7 years ago

HarleyWang93 commented 7 years ago

AJAX 是什么?有什么作用?

  1. 创建一个对象
var request = new XMLHttpRequest()
  1. 监听请求成功后的状态变化
request.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    console.log(request.responseText)
  }
};

第三行的 request.responseText 就是服务器返回的内容了(默认是字符串)

  1. 设置请求参数
request.open("GET", "filename", true);
  1. 发送请求
request.send();

这 4 步看起来是有些复杂的,不要紧,jQuery.ajax 对这 4 步进行了封装,只需要一步就可以了:

$.get('filename').then(function(response){
  // 这里的 response 就是返回的内容
})

AJAX 的作用

更好的用户体验(不用刷新页面,或者说只需要刷新部分页面)

前后端开发联调需要注意哪些事情?后端接口完成前如何 mock 数据?

  1. 约定接口类型(GET 还是 POST)、名字(传递到那个路由)
  2. 前端传递给后端的参数(参数的类型、格式)
  3. 后端返回数据的格式(是数组还是字符串还是 JSON 格式)

点击按钮,使用 ajax 获取数据,如何在数据到来之前防止重复点击?

//状态锁伪代码
var lock = false;
btn.addEventListener("click",function(){
  if(lock){
    return; //如果没有收到数据 就不往下执行
  }else{
    lock = true;
    ajax({
      ....
      lock = false; //收到响应之后才把 false 赋值给 lock
    })
   }
});

实现加载更多的功能,效果范例377,后端在本地使用server-mock来模拟数据

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>加载更多</title>
  <style>
    .ct{
      list-style: none;
      padding: 0;
    }
    .ct li{
      margin-bottom: 10px;
      border: 1px solid;
      cursor: pointer;
      height: 38px;
      padding-top: 10px;
    }
    .ct li:hover{
      background: green;
      color:white;
    }
    .button {
      display: block;
      width: 100px;
      height: 40px;
      line-height: 40px;
      margin: 0 auto;
      border: 1px solid red;
      text-align: center;
      text-decoration: none;
      color: red;

    }
  </style>
</head>
<body>
  <ul class="ct">
    <li>内容1</li>
    <li>内容2</li>
  </ul>
  <a href="#" class="button">加载更多</a>
  <script>
    var button = document.querySelector('.button')
    var content = document.querySelector('.ct')
    var xhr = new XMLHttpRequest()
    var index = 2
    var sendEnd = false
    button.addEventListener('click', function (e) {
      e.preventDefault()
      if (sendEnd){
        return
      }
      xhr.onreadystatechange = function () {
        if(xhr.readyState === 4 && (xhr.status == 200||xhr.status == 304)){
          //获取数据
          var data = JSON.parse(xhr.responseText)
          var fragment = document.createDocumentFragment()
          for (var i in data){
            //创建元素
            var li = document.createElement('li')
            //将内容放入元素
            li.innerText = data[i]
            fragment.appendChild(li)
          }
          content.appendChild(fragment)
          sendEnd = false
        }
      }

      xhr.open('get', '/loadMore?index=' + index + '&length=5', true)
      xhr.send()
      sendEnd = true
      index += 5

    })
  </script>
</body>
</html>
//  router.js
app.get('/loadMore', function(req, res) {
  var curIdx = req.query.index;
  var len = req.query.length;
  var data = [];

  for(var i = 0; i < len; i++) {
    data.push('新闻' + (parseInt(curIdx) + i))
  }
  res.send(data);
});

推荐阅读

AJAX 是什么? AJAX-阮一峰 你真的会使用XMLHttpRequest吗? 怎样防止重复发送 Ajax 请求?