我的前端学习笔记23—— ajax

1,ajax 是什么?有什么作用?

  • ajax全称为Asynchronous JavaScript and XML,可以实现在不重新加载整个页面的情况下,对网页的某一部分进行更新(异步)。
  • ajax在 浏览器与web服务器之间使用异步数据传输(HTTP请求)从服务器获取数据。
    这里的异步指的是脱离当前浏览器页面的请求、加载等单独执行,这就意味着可以在不重新加载整个网页的情况下,通过JavaScript发送请求,接受服务器传来的数据,然后操作DOM将新数据对网页的某部分进行更新,使用ajax最直观的感受就是向服务器获取新数据不需要刷新页面等待了。

2,前后端开发联调需要注意哪些事情?后端接口完成前如何 mock 数据?(npm install -g server-mock) 知识点视频-如何 mock 数据

  • 前后端联调是一种 真实业务数据本地mock数据之间来回切换以达到前后端分离架构下的不同开发速度时数据交换的一种方式方法。

  • 需要注意的事情有:

  • 约定前后端联调的时间。

  • 约定双方需要传输的数据和接口,在接口文档中确定好参数的名称、格式等。

  • 约定请求和响应的格式和内容。

  • 什么是mock数据:就是html发送一个ajax的请求。这个请求到哪里去,然后后端如何去响应这个请求。
    后端去获取数据,并且定义接口;
    前端编写页面,并且和后端进行交互。

  • mock数据的方法有:

  • 使用server-mock或mock.js (http://mockjs.com/ )搭建模拟服务器,进行模拟测试(优点是不需要熟练掌握后台PHP语言,采用熟悉的js语法);
    步骤:

  • 安装node.js,呼出cmd命令

  • 选取一个文件夹,使用npm install -g server -mock进行全局安装
    输入mock start可以启动一个web 服务器,他的根目录就是你选取的文件夹,启动完成之后,web服务器就可以展示了

  • 浏览器输入localhost:8080就是你选取的文件夹

  • 使用mock init会自动的在文件夹下生成3个文件

  • 当html使用url对接口进行请求,会被router.js里相同的接口接受

  • 比如:

app.get("/loadMore",function(req,res){
//接受名为loadMore的php的参数
res.send({status:0,//向html发出正确的回参
          msg:"hello 饥人谷"//回参中的值 
          })
})
  • 使用XAMPP等工具,编写PHP文件来进行测试。

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

方法一:使用button的disabled属性,配合setTimeout 0,使在数据到来之前按钮都不能被点击

el.addEventListener("click",function(){ 
    this.disabled=true; ajax(); 
    setTimeout(this.disabled=false,0);
});

方法二:可设置标记变量flag,初始时设置flag为true.在用户点击提交按钮后,判断flag是否为true,如果是则发送ajax请求,并把flag设置为false。 等服务端给出响应后再把flag设置为true;

var ready = true;
    $('.add-more').on('click', function(){
    ... 
    if(!ready){
        return; 
    } 
    ready = false;
    $.ajax({
       ... 
       complete: function(){
            ready = true; 
            }
         }); 
    });
  • 代码题:

一,封装一个 ajax 函数,能通过如下方式调用

function ajax(opts){ 
    // todo ...
}
document.querySelector('#btn').addEventListener('click', function(){
    ajax({
        url: 'getData.php', //接口地址 
        type: 'get', // 类型, post 或者 get, 
        data: { 
            username: 'xiaoming', 
            password: 'abcd1234' 
        }, 
        success: function(ret){
        console.log(ret); // {status: 0} 
        }, 
       error: function(){
        console.log('出错了') 
        } 
    })
});
  • 未封装的普通ajax代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<!-- 需求是:在输入框输入用户名,点击按钮,打包请求后发给后台,后台响应对应的姓名和年龄 -->
<input type="text" name="username" id="username" placeholder="请输入用户名">
<button class="btn">提交</button>
<dl id="ct">

</dl>

<script>
  document.querySelector('.btn').addEventListener('click',function(){
    var xmlhttp = new XMLHttpRequest();
    username = document.querySelector('#username').value;
    var url = 'renwu1.php' + '?username='+username;

    // GET方式:
    xmlhttp.open('GET',url,true);
    xmlhttp.send();
    //POST方式:
    // xmlhttp.open('POST','renwu1.php',true);
    // xmlhttp.setRequestHeader("content-type","application/x-www-form-urlencoded");
    // xmlhttp.send("username="+username);

    xmlhttp.onreadystatechange = function(){
      if(xmlhttp.readyState==4 && xmlhttp.status==200){
        var userInfo = JSON.parse(xmlhttp.responseText);
        dealWith(userInfo);
      }
    }
  });
  function dealWith(userInfo){
    var str = '<dt>性别:</dt>';
    str += '<dd>'+ userInfo.sex +'</dd>';
    str += '<dt>年龄:</dt>';
    str += '<dd>'+userInfo.age +'</dd>';
    document.querySelector('#ct').innerHTML = str;
  }
</script>
</body>
</html>
  • PHP代码:

    <?php
        // $username = $_GET['username'];
        $username = $_POST['username'];
        if($username === 'har'){
          $ret = array('sex'=>'男','age'=>'23');
        }else if($username === 'marry'){
          $ret = array('sex'=>'女','age'=>'22');
        }else{
          $ret = array('sex'=>'女','age'=>'27');
        }
        echo json_encode($ret);  //输出标准json格式
    ?>
    
  • 封装

function ajax(opts){
    var xmlhttp = new XMLHttpRequest();
    var dataStr = '';
    for(var key in opts.data){
      dataStr += key + '=' + opts.data[key]+'&'
    }
    dataStr = dataStr.substr(0,dataStr.length-1)

    if(opts.type.toLowerCase()==='post'){
      xmlhttp.open(opts.type,opts.url,true);
      xmlhttp.setRequestHeader('content-type','application/x-www-form-urlencoded');
      xmlhttp.send(dataStr);
    }
    if(opts.type.toLowerCase()==='get'){
      xmlhttp.open(opts.type,opts.url+'?'+ dataStr,true);
      xmlhttp.send();
    }

    xmlhttp.onreadystatechange = function(){
      if(xmlhttp.readyState == 4 && xmlhttp.status == 200 ){
        var json = JSON.parse(xmlhttp.responseText);
        opts.success(json);
      }
      if(xmlhttp.readyState == 4 && xmlhttp.status == 404 ){
        opts.error();
      }
    };
}

document.querySelector('#btn').addEventListener('click', function(){
    ajax({
        url: 'renwu1.php',   //接口地址
        type: 'get',               // 类型, post 或者 get,
        data: {
            username: document.querySelector('#username').value;
            password: document.querySelector('#password');
        },
        success: function(jsonData){
            dealWith(jsonData);       // {status: 0}
        },
        error: function(){
           console.log('出错了')
        }
    })
});
function dealWith(userInfo){
  var str = '<dt>性别:</dt>';
  str += '<dd>'+ userInfo.sex +'</dd>';
  str += '<dt>年龄:</dt>';
  str += '<dd>'+userInfo.age +'</dd>';
  document.querySelector('#ct').innerHTML = str;
};

二,封装一个 ajax 函数,能通过如下方式调用

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>任务二</title>
    <style media="screen">
      div,a{
        margin:0;
        padding:0;
      }
      .ct li{
        border:1px solid #ccc;
        height: 50px;
        line-height:50px;
        padding-left: 10px;
        margin: 10px 0;
        list-style:none;
      }
      .ct{
        padding-left: 0px;
      }
      .btn{
        border: 1px solid red;
        text-align: center;
        display: inline-block;
        height: 30px;
        width: 80px;
        line-height: 30px;
        cursor: pointer;
        position:absolute;
        left:50%;
        margin-top: 30px;
        margin-left: -40px;
        border-radius: 5px;
      }
      .btn:active{
        background-color: pink;
        color: #222;
      }
    </style>
  </head>
  <body>
    <ul class="ct">
      <li>内容1</li>
      <li>内容2</li>
    </ul>
    <a class="btn">加载更多</a>

    <script type="text/javascript">


      function ajax(opts){
        var xml = new XMLHttpRequest();
        var datastr = '';
        for(var key in opts.data){
          datastr += key + '=' + opts.data[key] + '&'
        }
        datastr=datastr.substr(0,datastr.length-1);

        if(opts.type.toLowerCase()=='get'){
          xml.open(opts.type,opts.url+'?'+datastr,true);
          xml.send();
        }
        if(opts.type.toLowerCase()=='post'){
          xml.open(opts.type,opts.url,true);
          xml.send(datastr);
          xml.setRequestHeader('content-type','application/x-www-form-urlencoded');
        }
        xml.onreadystatechange = function(){
          if(xml.readyState==4 && xml.status == 200){
            var json = JSON.parse(xml.responseText);
            opts.success(json);
          }
          if(xml.readyState==4 && xml.status ==404){
            opts.error();
          }
        }
      }

      var cur = 3;
      document.querySelector('.btn').addEventListener('click', function(){
          ajax({
              url: 'renwu2.php',   //接口地址
              type: 'get',               // 类型, post 或者 get,
              data: {
                start:cur,
                len: 6
              },
              success: function(json){
                  if(json.status==1){
                    append(json.data);
                    cur += 6;
                  }else{
                    console.log('失败啦')
                  }     // {status: 0}
              },
              error: function(){
                 console.log('出错了')
              }
          })
      });

      function append(arr){
        for(var i=0; i<arr.length; i++){
          var li = document.createElement('li');
          li.innerHTML = arr[i];
          document.querySelector('.ct').appendChild(li);
        }
      }
    </script>
  </body>
</html>

PHP端:

    <?php
        $start = $_GET['start'];
        $len = $_GET['len'];
        $items = array();

        for($i=0;$i<$len;$i++){
            array_push($items,'内容'.($start+$i));
        }
        $ret = array('status'=>1,'data'=>$items);
      sleep(1);
        echo json_encode($ret);

    ?>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • ajax 是什么?有什么作用? ajax是Asynchronous JavaScript + XML的简写。是一项...
    coolheadedY阅读 195评论 0 0
  • 问答 1. ajax 是什么?有什么作用? Ajax是Asynchronous JavaScript and XM...
    Maggie_77阅读 399评论 0 0
  • 信息:Pull Request 的命令行管理 思考:git am 命令可以将patch文件合入当前代码;cherr...
    黑知更鸟阅读 145评论 0 0
  • 凌波寒梦一声起, 岁月惊雷, 独叹时光无限好, 一宵美梦。 满含双泪目歇歇, 春光依旧, 倚高独尽天涯路, 志存高远。
    鬼谷摆摊阅读 143评论 2 6