ajax實(shí)踐

1鉴分、 ajax 是什么?有什么作用箕戳?

ajax即asynchronous javascript and xml(異步j(luò)avascript和xml)
作用:

  • 實(shí)現(xiàn)網(wǎng)頁(yè)的異步加載响疚,局部刷新網(wǎng)頁(yè)
  • 向服務(wù)器獲取新數(shù)據(jù)時(shí)不需要刷新整個(gè)網(wǎng)頁(yè),提高用戶體驗(yàn)

2译荞、前后端開(kāi)發(fā)聯(lián)調(diào)需要注意哪些事情瓤的?后端接口完成前如何 mock 數(shù)據(jù)?

前后端開(kāi)發(fā)聯(lián)調(diào)需要注意事項(xiàng):

  • 約定數(shù)據(jù):有哪些需要傳輸?shù)臄?shù)據(jù)吞歼,數(shù)據(jù)類型是什么圈膏;
  • 約定接口:確定接口名稱及請(qǐng)求和響應(yīng)的格式,請(qǐng)求的參數(shù)名稱篙骡、響應(yīng)的數(shù)據(jù)格式稽坤;
  • 根據(jù)這些約定整理成接口文檔

如何mock數(shù)據(jù):

  • 可以根據(jù)接口文檔,使用假數(shù)據(jù)來(lái)驗(yàn)證我們制作的頁(yè)面響應(yīng)和接口是否正常糯俗。
  • 可以用xampp進(jìn)行模擬
  • 也可使用server-mock

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

  var btn = document.querySelector('.btn')
  var lock = true
  btn.addEventListener('click',function(){
    if (!lock) {
      return
    }

    var xhr. = new XMLHttpRequest()
    xhr.onreadystatechange = function(opts){
      if (xhr.readyState === 4 && xhr.status ===200) {
        var data = JSON.parse(xhr.responseText)
        opts.success(data)
      }else if (xhr.readyState === 4) {
        opts.error()
      }
      lock = true
    }
    xhr.open()
    xhr.send()
    lock = false

  })

4杖玲、封裝一個(gè) ajax 函數(shù),能通過(guò)如下方式調(diào)用淘正。后端在本地使用server-mock來(lái) mock 數(shù)據(jù)

function ajax(opts){
    // todo ...
}
document.querySelector('#btn').addEventListener('click', function(){
    ajax({
        url: '/login',   //接口地址
        type: 'get',               // 類型摆马, post 或者 get,
        data: {
            username: 'xiaoming',
            password: 'abcd1234'
        },
        success: function(ret){
            console.log(ret);       // {status: 0}
        },
        error: function(){
           console.log('出錯(cuò)了')
        }
    })
});

代碼

  <input class="username" type="text" name="username" placeholder="請(qǐng)輸入用戶名">
  <input class="password" type="password" name="password" placeholder="請(qǐng)輸入密碼">
  <input class="btn" type="submit" name="submit" value="提交">
  <ul class="ct"></ul>

  <script type="text/javascript">
    function ajax(opts) {
      var xhr = new XMLHttpRequest()
      xhr.onreadystatechange = function(){
        if (xhr.readyState === 4 && xhr.status === 200) {
          var results = JSON.parse(xhr.responseText)
          opts.success(results)
        } else if (xhr.readyState === 4 && xhr.status ===404) {
          opts.error()
        }
      }

      var dataStr = ''
      for (var key in opts.data) {
        dataStr += key + '=' + opts.data[key] + '&'
      }
      dataStr = dataStr.substr(0,dataStr.length-1)
/*
      var dataArr = []
      for (var key in opts.data) {
        dataArr.push(key + '=' + opts.data[key])
      }
      dataStr = dataArr.join('&') 
*/
      var urlStr = ''
      if (opts.type === 'get') {
        urlStr += opts.url + '?' + dataStr
        xhr.open(opts.type,urlStr,true)
        xhr.send(null) 
      }else if (opts.type === 'post') {
        xhr.open(opts.type,opts.url,true)
        xhr.setRequestHeader('content-type','application/x-www-form-urlencoded')
        xhr.send(dataStr)
      }
    }

    var username = document.querySelector('.username')
    var password = document.querySelector('.password')
    var ct = document.querySelector('.ct')
    var btn = document.querySelector('.btn')
    btn.addEventListener('click', function(){
      ajax({
        url: '/login',   //接口地址
        type: 'post',               // 類型, post 或者 get,
        data: {
          username: username.value,
          password: password.value
        },
        restype: 'json',
        success: function(ret){   
          ct.innerText = ret
          console.log(ret);       // {status: 0}
        },
        error: function(){
          console.log('出錯(cuò)了')
        }
      })
    });
  </script>

mock.js

app.get('/login', function(req, res) {
  var username = req.query.username
  var password = req.query.password
  console.log('有請(qǐng)求來(lái)了');
  console.log(username,password);
    if (username === 'xiaoming' && password === 'abcd1234') {
      var friends = ['xiaoming','abcd1234'] 
    res.send(friends);
    }else{
    var friends = ['請(qǐng)重新輸入']
        res.send(friends);
    }
});
app.post('/login', function(req, res) {
  var username = req.body.username
  var password = req.body.password
  console.log('有請(qǐng)求來(lái)了');
    console.log(username,password);
    if (username === 'xiaoming' && password === 'abcd1234') {
      var friends = ['xiaoming','abcd1234'] 
      res.send(friends);
    }else{
      var friends = ['請(qǐng)重新輸入']
      res.send(friends);
    }
});

5鸿吆、實(shí)現(xiàn)加載更多的功能囤采,后端在本地使用server-mock來(lái)模擬數(shù)據(jù)

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>加載更多</title>
  <style type="text/css">

    ul,li {
      list-style: none;
      padding: 0;
    }
    li {
     display: block;
     margin: 10px auto;
     border: 1px solid #ccc;
     padding: 5px;
     /*
     width: 600px;
     height: 30px;
     box-sizing: border-box;
     */
    }
    .ct li:hover {
      background-color: green;
      cursor: pointer;
    }
    .btn {
      cursor: pointer;
      width: 100px;
      height: 40px;
      border-radius: 3px;
      font-size: 16px;
      margin: 20px auto;
      display: block;
      outline: none;
    }
    .btn:hover {
      background-color: pink;
      color: green;
    }
  </style>
</head>
<body>
  <ul class="ct"></ul>
  <button class="btn">加載更多</button>

  <script type="text/javascript">
    var ct = $('.ct')
    var btn = $('.btn')
    var lock = true
    var index = 0

    btn.addEventListener('click', function(){
      if (!lock) {
        return
      }
      ajax({
        url: '/loadMore',   //接口地址
        type: 'post',               // 類型, post 或者 get,
        data: {
          index: index,
          length: 5
        },
        restype: 'json',
        success: function(ret){
          var fragment = document.createDocumentFragment()
          for (var i = 0; i < ret.length; i++) {
                var li = document.createElement('li')
                li.innerText = ret[i]
                fragment.appendChild(li)
             }   
          ct.appendChild(fragment)
          index += 5       // {status: 0}
        },
        error: function(){
          console.log('出錯(cuò)了')
        }
        
      })

    });    

    function ajax(opts){
      var xhr = new XMLHttpRequest()
      xhr.onreadystatechange = function(){
        if (xhr.readyState === 4 && xhr.status === 200) {
          var data
          if (opts.restype.toLowerCase() === 'text') {
            data = xhr.responseText
          } else if (opts.restype.toLowerCase() === 'json') {
            data = JSON.parse(xhr.responseText)
          } else if (opts.restype.toLowerCase() === 'xml') {
            data = xhr.responseXML
          }
          opts.success(data)
        }else if(xhr.readyState === 4){
          opts.error(); 
        }
        lock = true
      }

      var dataStr = ''
      for (var key in opts.data) {
        dataStr += key + '=' + opts.data[key] + '&'
      }
      dataStr = dataStr.substr(0,dataStr.length-1)
/*
      var dataArr = []
      for (var key in opts.data) {
        dataArr.push(key + '=' + opts.data[key])
      }
      dataStr = dataArr.join('&') 
*/
      var urlStr = ''
      if (opts.type === 'get') {
        urlStr += opts.url + '?' + dataStr
        xhr.open(opts.type,urlStr,true)
        xhr.send(null) 
      }else if (opts.type === 'post') {
        xhr.open(opts.type,opts.url,true)
        xhr.setRequestHeader('content-type','application/x-www-form-urlencoded')
        xhr.send(dataStr)
      }
      lock = false
    }

    function $(cls){
      return document.querySelector(cls)
    }
  </script>
</body>
</html>

mock數(shù)據(jù)

app.get('/loadMore',function(req,res) {
  var index = req.query.index
  var length = req.query.length
  var data = []
  for (var i = 0; i < length; i++) {
    data.push('內(nèi)容' + (parseInt(index) + i+1))
  }
  setTimeout(send,1000)
  function send(){
    res.send(data)
  }
    // body...
})

app.post('/loadMore',function(req,res) {
  var index = req.body.index
  var length = req.body.length
  var data = []
  for (var i = 0; i < length; i++) {
    data.push('內(nèi)容' + (parseInt(index) + i+1))
  }
  setTimeout(send,1000)
  function send(){
    res.send(data)
  }
  
    // body...
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惩淳,一起剝皮案震驚了整個(gè)濱河市蕉毯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黎泣,老刑警劉巖恕刘,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抒倚,居然都是意外死亡褐着,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門托呕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)含蓉,“玉大人频敛,你說(shuō)我怎么就攤上這事∠诳郏” “怎么了斟赚?”我有些...
    開(kāi)封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)差油。 經(jīng)常有香客問(wèn)我拗军,道長(zhǎng),這世上最難降的妖魔是什么蓄喇? 我笑而不...
    開(kāi)封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任发侵,我火速辦了婚禮,結(jié)果婚禮上妆偏,老公的妹妹穿的比我還像新娘刃鳄。我一直安慰自己,他們只是感情好钱骂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布叔锐。 她就那樣靜靜地躺著,像睡著了一般见秽。 火紅的嫁衣襯著肌膚如雪愉烙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天张吉,我揣著相機(jī)與錄音齿梁,去河邊找鬼。 笑死肮蛹,一個(gè)胖子當(dāng)著我的面吹牛勺择,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伦忠,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼省核,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了昆码?” 一聲冷哼從身側(cè)響起气忠,我...
    開(kāi)封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赋咽,沒(méi)想到半個(gè)月后旧噪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脓匿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年淘钟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陪毡。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡米母,死狀恐怖勾扭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铁瞒,我是刑警寧澤妙色,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站慧耍,受9級(jí)特大地震影響身辨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芍碧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一栅表、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧师枣,春花似錦、人聲如沸萧落。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)找岖。三九已至陨倡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間许布,已是汗流浹背兴革。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜜唾,地道東北人杂曲。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袁余,于是被迫代替她去往敵國(guó)和親擎勘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • ajax 是什么颖榜?有什么作用棚饵? AJAX的全稱是Asynchronous JavaScript and XML(異...
    cross_王閱讀 334評(píng)論 0 0
  • 1: ajax 是什么?有什么作用掩完? Ajax是Asynchronous JavaScript and XML的縮...
    好奇而已閱讀 334評(píng)論 0 0
  • 1. ajax 是什么噪漾?有什么作用? AJAX即Asynchronous Javascript And XML(異...
    _李祺閱讀 277評(píng)論 0 0
  • 1.ajax 是什么且蓬?有什么作用欣硼? Asynchronous JavaScript and XML(異步的 Jav...
    clark124閱讀 241評(píng)論 0 0
  • 1. ajax 是什么?有什么作用缅疟? Ajax(Asynchronous JavaScript + XML)是一種...
    madpluto閱讀 173評(píng)論 0 0