我的前端學(xué)習(xí)筆記23—— ajax

1唆途,ajax 是什么?有什么作用肛搬?

  • ajax全稱為Asynchronous JavaScript and XML,可以實(shí)現(xiàn)在不重新加載整個(gè)頁(yè)面的情況下蛤奢,對(duì)網(wǎng)頁(yè)的某一部分進(jìn)行更新(異步)让腹。
  • ajax在 瀏覽器與web服務(wù)器之間使用異步數(shù)據(jù)傳輸(HTTP請(qǐng)求)從服務(wù)器獲取數(shù)據(jù)。
    這里的異步指的是脫離當(dāng)前瀏覽器頁(yè)面的請(qǐng)求瓜晤、加載等單獨(dú)執(zhí)行腹纳,這就意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,通過(guò)JavaScript發(fā)送請(qǐng)求足画,接受服務(wù)器傳來(lái)的數(shù)據(jù)佃牛,然后操作DOM將新數(shù)據(jù)對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新,使用ajax最直觀的感受就是向服務(wù)器獲取新數(shù)據(jù)不需要刷新頁(yè)面等待了象缀。

2爷速,前后端開發(fā)聯(lián)調(diào)需要注意哪些事情?后端接口完成前如何 mock 數(shù)據(jù)莉给?(npm install -g server-mock) 知識(shí)點(diǎn)視頻-如何 mock 數(shù)據(jù)

  • 前后端聯(lián)調(diào)是一種 真實(shí)業(yè)務(wù)數(shù)據(jù)本地mock數(shù)據(jù)之間來(lái)回切換以達(dá)到前后端分離架構(gòu)下的不同開發(fā)速度時(shí)數(shù)據(jù)交換的一種方式方法廉沮。

  • 需要注意的事情有:

  • 約定前后端聯(lián)調(diào)的時(shí)間。

  • 約定雙方需要傳輸?shù)臄?shù)據(jù)和接口叁幢,在接口文檔中確定好參數(shù)的名稱漂洋、格式等。

  • 約定請(qǐng)求和響應(yīng)的格式和內(nèi)容演训。

  • 什么是mock數(shù)據(jù):就是html發(fā)送一個(gè)ajax的請(qǐng)求贝咙。這個(gè)請(qǐng)求到哪里去,然后后端如何去響應(yīng)這個(gè)請(qǐng)求窟她。
    后端去獲取數(shù)據(jù)蔼水,并且定義接口;
    前端編寫頁(yè)面吊说,并且和后端進(jìn)行交互优炬。

  • mock數(shù)據(jù)的方法有:

  • 使用server-mock或mock.js (http://mockjs.com/ )搭建模擬服務(wù)器,進(jìn)行模擬測(cè)試(優(yōu)點(diǎn)是不需要熟練掌握后臺(tái)PHP語(yǔ)言雅宾,采用熟悉的js語(yǔ)法)葵硕;
    步驟:

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

  • 選取一個(gè)文件夾吐辙,使用npm install -g server -mock進(jìn)行全局安裝
    輸入mock start可以啟動(dòng)一個(gè)web 服務(wù)器蘸劈,他的根目錄就是你選取的文件夾,啟動(dòng)完成之后贤惯,web服務(wù)器就可以展示了

  • 瀏覽器輸入localhost:8080就是你選取的文件夾

  • 使用mock init會(huì)自動(dòng)的在文件夾下生成3個(gè)文件

  • 當(dāng)html使用url對(duì)接口進(jìn)行請(qǐng)求孵构,會(huì)被router.js里相同的接口接受

  • 比如:

app.get("/loadMore",function(req,res){
//接受名為loadMore的php的參數(shù)
res.send({status:0,//向html發(fā)出正確的回參
          msg:"hello 饑人谷"http://回參中的值 
          })
})
  • 使用XAMPP等工具烟很,編寫PHP文件來(lái)進(jìn)行測(cè)試蜡镶。

3官还,點(diǎn)擊按鈕毒坛,使用 ajax 獲取數(shù)據(jù),如何在數(shù)據(jù)到來(lái)之前防止重復(fù)點(diǎn)擊?

方法一:使用button的disabled屬性屯伞,配合setTimeout 0豪直,使在數(shù)據(jù)到來(lái)之前按鈕都不能被點(diǎn)擊

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

方法二:可設(shè)置標(biāo)記變量flag,初始時(shí)設(shè)置flag為true.在用戶點(diǎn)擊提交按鈕后饵撑,判斷flag是否為true唆貌,如果是則發(fā)送ajax請(qǐng)求,并把flag設(shè)置為false语卤。 等服務(wù)端給出響應(yīng)后再把flag設(shè)置為true;

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

一酪刀,封裝一個(gè) ajax 函數(shù),能通過(guò)如下方式調(diào)用

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('出錯(cuò)了') 
        } 
    })
});
  • 未封裝的普通ajax代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<!-- 需求是:在輸入框輸入用戶名诅需,點(diǎn)擊按鈕荧库,打包請(qǐng)求后發(fā)給后臺(tái),后臺(tái)響應(yīng)對(duì)應(yīng)的姓名和年齡 -->
<input type="text" name="username" id="username" placeholder="請(qǐng)輸入用戶名">
<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);  //輸出標(biāo)準(zhǔn)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('出錯(cuò)了')
        }
    })
});
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;
};

二牵现,封裝一個(gè) ajax 函數(shù),能通過(guò)如下方式調(diào)用

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>任務(wù)二</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>內(nèi)容1</li>
      <li>內(nèi)容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('出錯(cuò)了')
              }
          })
      });

      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,'內(nèi)容'.($start+$i));
        }
        $ret = array('status'=>1,'data'=>$items);
      sleep(1);
        echo json_encode($ret);

    ?>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市竿裂,隨后出現(xiàn)的幾起案子照弥,更是在濱河造成了極大的恐慌,老刑警劉巖悔常,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件给赞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡残邀,警方通過(guò)查閱死者的電腦和手機(jī)柑蛇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)空免,“玉大人盆耽,你說(shuō)我怎么就攤上這事∩阍樱” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵畅厢,是天一觀的道長(zhǎng)氮昧。 經(jīng)常有香客問(wèn)我浦楣,道長(zhǎng)振劳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任历恐,我火速辦了婚禮弱贼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吮旅。我一直安慰自己味咳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布责嚷。 她就那樣靜靜地躺著掂铐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聂受。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天蛋济,我揣著相機(jī)與錄音炮叶,去河邊找鬼。 笑死祟辟,一個(gè)胖子當(dāng)著我的面吹牛侣肄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼僚纷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怖竭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起痊臭,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤广匙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拼窥,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年总棵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了改含。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骤视,死狀恐怖鹃觉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祷肯,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布佑笋,位于F島的核電站斑鼻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颠锉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一拒垃、第九天 我趴在偏房一處隱蔽的房頂上張望瓷蛙。 院中可真熱鬧,春花似錦艰猬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胸蛛。三九已至樱报,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迹蛤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工嚷量, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逆趣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓身坐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親部蛇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理涯鲁,服務(wù)發(fā)現(xiàn)抹腿,斷路器,智...
    卡卡羅2017閱讀 134,720評(píng)論 18 139
  • ajax 是什么警绩?有什么作用崇败? ajax是Asynchronous JavaScript + XML的簡(jiǎn)寫肩祥。是一項(xiàng)...
    coolheadedY閱讀 198評(píng)論 0 0
  • 問(wèn)答 1. ajax 是什么混狠?有什么作用? Ajax是Asynchronous JavaScript and XM...
    Maggie_77閱讀 400評(píng)論 0 0
  • 信息:Pull Request 的命令行管理 思考:git am 命令可以將patch文件合入當(dāng)前代碼将饺;cherr...
    黑知更鳥閱讀 151評(píng)論 0 0
  • 凌波寒夢(mèng)一聲起予弧, 歲月驚雷, 獨(dú)嘆時(shí)光無(wú)限好桌肴, 一宵美夢(mèng)琉历。 滿含雙淚目歇歇坠七, 春光依舊旗笔, 倚高獨(dú)盡天涯路彪置, 志存高遠(yuǎn)拳魁。
    鬼谷擺攤閱讀 149評(píng)論 2 6