婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 基于h5的history改善ajax列表請求體驗

基于h5的history改善ajax列表請求體驗

熱門標簽:越南河內地圖標注 個人怎樣在百度地圖標注地名 機器人電銷騙局揭秘 ai機器人電銷資源 云呼外撥網絡電話系統 硅語電話機器人公司 騰訊地圖標注位置能用多久 地圖標注項目怎么樣 超級大富翁地圖標注

信息比較豐富的網站通常會以分頁顯示,在點“下一頁”時,很多網站都采用了動態請求的方式,避免頁面刷新。雖然大家都是ajax,但是從一些小的細節還是 可以區分優劣。一個小的細節是能否支持瀏覽器“后退”和“前進“鍵。本文討論兩種方法,讓瀏覽器可以后退和前進,或者說讓ajax就像重定向到新頁面一樣 擁有能夠返回到上一頁或者前進到下一頁。

      數據實現分頁顯示,最簡單的做法是在網址后面加多個page的當數,點“下一頁”時,讓網頁重定向到page+1的新地址。例如新浪的新聞網就 是這么做的,通過改變網址實現:index_1、index_2、index_3……。但是如果這個列表并不是頁面的主體部分,或者頁面的其它部分有很多 圖片等豐富元素,例如導航是一個很大的slider,再使用這樣的方式,整個頁面會閃爍得厲害,并且很多資源得重新加載。所以使用ajax請求,動態改變 DOM。

      但是普通的動態的請求不會使網址發生變化,用戶點了下一頁,或者點了第幾頁,想要返回到上一個頁面時,可能會去點瀏覽器的返回鍵,這樣就導致返回的時候不是返回到原先查看的頁面了,而是上一個網址了。例如央視的新聞網就是這樣的。下面從ajax請求開始說起,以一個完整的案例進行分析。

      做了一個demo

   首先,寫一個請求:

 //當前第幾頁
  var pageIndex = 0;
  //請求函數
  function makeRequest(pageIndex){
    var request = new XMLHttpRequest();
    request.onreadystatechange = stateChange;
    //請求傳兩個參數,一個是當前第幾頁,另一個是每頁的數據條數
    request.open("GET", "/getBook?page=" + pageIndex + "limit=4", true);
    request.send(null);
    function stateChange(){
      //狀態碼為4,表示loaded,請求完成
      if(request.readyState !== 4 ){
        return;
      }
      //請求成功
      if(request.status >= 200  request.status  300 || request.status === 304){
        var books = JSON.parse(request.responseText);
        renderPage(books); 
      }
    }
  }

     拿到數據后進行渲染:

  function renderPage(books){
    var bookHtml = 
      "table>" +
      "  tr>" +
      "    th>書名/th>" +
      "    th>作者/th>" +
      "    th>版本/th>" +
      "  /tr>";
    for(var i in books){
      bookHtml += 
        "tr>" +
        "  td>" + books[i].book_name + "/td>" +
        "  td>" + books[i].author + "/td>" +
        "  td>" + books[i].edition + "/td>" +
        "/tr>";
    }
    bookHtml += "/table>";
    bookHtml += 
      "button>上一頁/button>" + 
      "button onclick='nextPage();'>下一頁/button>";
    var section = document.createElement("section");
    section.innerHtml = bookHtml;
    document.getElementById("book").appendChild(section); 
  }

這樣一個基本的ajax請求就搭起來了,然后再響應“下一頁”按鈕:

  function nextPage(){
    //將頁面的index加1
    pageIndex++;
    //重新發請求和頁面加載
    makeRequest(pageIndex);
  }

到此,如果不做任何處理的話,就不能夠發揮瀏覽器返回、前進按鈕的作用。

      如果能夠檢測用戶點了后退、前進按鈕的話,就可以做些文章。h5就是增加了這么一個事件window.onpopstate,當用戶點擊那兩個按鈕就會觸 發這個事件。但是光檢測到這個事件是不夠的,還得能夠傳些參數,也就是說返回到之前那個頁面的時候得知道那個頁面的pageIndex。通過 history的pushState方法可以達到這個目的,pushState(pageIndex)將當前頁的pageIndex存起來,再返回到這個 頁面時獲取到這個pageIndex。pushState的參數如下:

復制代碼 代碼如下:

window.history.pushState(state, title, url);

      其中state為一個object{},用來存放當前頁面的數據,title標題沒有多大的作用,url為當前頁面的url,一旦更改了這個url,瀏覽器地址欄的地址也會跟著變化。

      于是,在請求下一頁數據的nextPage函數里面,加多一步操作:

  function nextPage(){
    pageIndex++;
    makeRequest(pageIndex);
    //存放當前頁面的數據
    window.history.pushState({page: pageIndex}, null, window.location.href); 
  }

然后監聽popstate事件:

  //如果用戶點擊返回或者前進按鈕
  window.addEventListener("popstate", function(event){
    var page = 0;
    //由于第一頁沒有pushState,所以返回到第一頁的時候是沒有數據的,因此得做下判斷
    if(event.state !== null){
      page = event.state.page;
    }
    makeRequest(page); 
    pageIndex = page;
  });

     state數據通過event傳進來,這樣就可以得到pageIndex。


但是,這樣實現還有問題,在第二頁的時候如果刷新頁面的話,會發生錯亂,如下所示:首先點下一頁到第二頁,然后刷新頁面,出現第一頁,再點下一頁,出現第二頁,點返回時出現問題,顯示還是第二頁,不是期望的第一頁,直到再次點返回時才是第一頁:

 從右邊的工具欄可以發現,點第一次返回的時候獲取到的pageIndex仍然是1。對于這種情況,需要分析history模型,如下所示:

 可以理解為對history的操作,瀏覽器有一個隊列,用來存放訪問的記錄,包括每個訪問的網址還有state數據。一開始,隊列的首指針指向page = 0的位置,點下一頁時,執行了pushState,在這個隊列插入了一個元素,同時通過pushState操作記錄了這個元素的url和state數據。 在這里可以看出,pushState的操作最重要的作用還是給history隊列插入元素,這樣瀏覽器的后退按鈕才不是置灰的狀態,其次才是上面說的存放 數據。點后退的時候,隊首指針后退一步指向page = 0的位置,點前進時又前進指向page = 1的位置。

如果在page = 1的位置刷新頁面,模型是這個樣子的:

在第2步刷新的時候,頁面的pageIndex又恢復成默認值0,所以page = 0,顯示第一頁數據,但是history所用的隊列并沒有改變。然后再點下一頁時,又給這個隊列push了一個元素,這個隊列就有兩個pageIndex 為1的元素,所以必須得兩次返回才能回到page = 0的位置,也就是上面說的錯亂的情況。

根據上面的分析,這樣的實現是有問題的,一但用戶不是在page = 0的位置刷新頁面,就會出現需要點多次返回按鈕才能夠回到原先的頁面。

所以得在刷新的時候,把當前頁的state數據更新一下,用replaceState,替換隊列隊首指針的數據,也就是當前頁的數據。方法是頁面初始化時replace一下:

window.history.replaceState({page: pageIndex /*此處為0*/}, null, window.location.href);
這樣模型就變成:

但其實用戶刷新的時候更希望的是還是顯示當前頁,而不是回到第一頁。一個解決辦法是用當前頁的window.history.state數據,這個屬性瀏覽器支持得比較晚。在頁面初始化時設置pageIndex時就從history.state取:

 

var pageIndex = window.history.state === null ? 0 : window.history.state.page; 

      safari里面的history.state是最近執行pushState傳入的數據,因此這個辦法在chrome/firefox里面行得通,但是safari行不通。

      第二種辦法是借助h5的localStorage存放當前頁數:

 //頁面初始化,取當前第幾頁先從localStorage取
  var pageIndex = window.localStorage.pageIndex || 0;

  function nextPage(){
    //將頁面的index加1,同時存放在localStorage
    window.localStorage.pageIndex = ++pageIndex;
    //重新發請求和頁面加載
    makeRequest(pageIndex);
    window.history.pushState({page: pageIndex}, null, window.location.href); 
  }

  window.addEventListener("popstate", function(event){
    var page = 0;
    if(event.state !== null){
      page = event.state.page;
    }
    makeRequest(page); 
    //點擊返回或前進時,需要將page放到localStorage
    window.localStorage.pageIndex = page;
  });

      將頁面中所有改變pageIndex的地方,同時放到localStorage。這樣刷新頁面的時候就可以取到當前頁的pageIndex。

      上面的方法都是將pageIndex放到了state參數里,還有一種方法是把它放到第三個參數url里,也就是說通過改變當前頁網址的辦法。pageIndex從網址里面取:

 //當前第幾頁
   var pageIndex = window.location.search.replace("?page=", "") || ;
   function nextPage(){
     //將頁面的index加
     ++pageIndex;
     //重新發請求和頁面加載
     makeRequest(pageIndex);
     window.history.pushState(null, null, "?page=" + pageIndex);
   }

      注意,一旦執行了第8行的pushState,當前網址的地址就會發生變化。

      有一點需要注意的是,window.history.length雖然返回是的當前隊列的元素個數,但不代表history本身就是那個隊列,通過不同瀏覽器的對history[i]的輸出:

   可以看到history是一個數組,它的作用是讓用戶拿到history.length,當前的長度,但是填充的內容是不確定的。 

      除了使用history之外,還有借助hash的方法,網易新聞就是使用了這樣的方法:

   //當前第幾頁
   var pageIndex = window.location.hash.replace("#page=", "") || ;
   function nextPage(){ 
     makeRequest(pageIndex);
     window.location.hash = "#page=" + pageIndex;
   }
   window.addEventListener("hashchange", function(){
     var page = window.location.hash.replace("#page=", "") || ;
     makeRequest(page);
   });

      關于支持性,參考caniuse網站:history IE10及以上支持,hashchange的支持性較好,IE8及以上都支持。

      雖然hashchange的支持性較好,但是history的優點是可以傳數據。對一些復雜的應用可能會有很大的發揮作用,同時history支持back/go操作。

以上本文關于h5的history改善ajax列表請求體驗,希望大家喜歡。

您可能感興趣的文章:
  • 使用ajax和history.pushState無刷新改變頁面URL示例
  • 基于h5 ajax實現手機定位(demo)
  • 基于Jquery.history解決ajax的前進后退問題

標簽:林芝 洛陽 鄭州 邢臺 舟山 海南 內蒙古 遼源

巨人網絡通訊聲明:本文標題《基于h5的history改善ajax列表請求體驗》,本文關鍵詞  基于,的,history,改善,ajax,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《基于h5的history改善ajax列表請求體驗》相關的同類信息!
  • 本頁收集關于基于h5的history改善ajax列表請求體驗的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一区二区三区四区五区视频在线观看| 国内偷窥港台综合视频在线播放| 成人精品视频一区二区三区| 国产精品国模大尺度视频| 欧美曰成人黄网| 日本怡春院一区二区| 国产精品久久久久久久久晋中 | 亚洲品质自拍视频| 56国语精品自产拍在线观看| 丁香另类激情小说| 麻豆精品一区二区三区| 亚洲图片欧美综合| 国产精品福利影院| 精品国产伦一区二区三区观看方式| 91国内精品野花午夜精品| 成人免费视频视频| 国产91丝袜在线播放0| 免费一级片91| 日韩精品福利网| 亚洲电影视频在线| 夜夜嗨av一区二区三区| 国产欧美日韩三区| 久久久久国产精品免费免费搜索| 亚洲成人av免费| 国产精品色呦呦| 无吗不卡中文字幕| 亚洲视频在线一区| 亚洲欧洲av一区二区三区久久| 91精品国产色综合久久ai换脸 | 日韩一区在线播放| 中文欧美字幕免费| 专区另类欧美日韩| 亚洲另类春色校园小说| 亚洲精品你懂的| 亚洲妇熟xx妇色黄| 伦理电影国产精品| 国产999精品久久久久久| 亚洲品质自拍视频| 色综合婷婷久久| 亚洲精品国产无天堂网2021| 国产sm精品调教视频网站| 在线亚洲免费视频| 波多野结衣在线一区| 国产一区在线不卡| 久久精品国产成人一区二区三区| 中文字幕免费不卡在线| 国内外成人在线| 欧美放荡的少妇| 亚洲一区视频在线| 国产在线一区二区综合免费视频| 在线观看av一区二区| 欧美一级午夜免费电影| 国产中文一区二区三区| 亚洲精品大片www| 亚洲h在线观看| 中文字幕二三区不卡| 亚洲欧美日韩小说| 2023国产一二三区日本精品2022| 亚洲午夜激情av| 免费的成人av| 亚洲精品国产无天堂网2021| 波波电影院一区二区三区| 亚洲成国产人片在线观看| 日韩中文字幕亚洲一区二区va在线| 亚洲欧洲色图综合| 欧美高清dvd| 国产欧美一区在线| 久久久久久久综合色一本| 一区二区视频免费在线观看| 久久久精品欧美丰满| 日韩一区二区三区视频| 欧美久久久久久久久中文字幕| 看电影不卡的网站| 欧美日韩国产综合一区二区三区| av电影天堂一区二区在线| 一个色在线综合| 本田岬高潮一区二区三区| 国产福利一区二区三区视频| 精品一区二区三区视频 | 欧美久久久久久久久久| 欧美韩国一区二区| 欧美成va人片在线观看| 欧美人狂配大交3d怪物一区| 久久一区二区三区四区| 精品少妇一区二区三区免费观看| 亚洲综合一区二区精品导航| 日韩精品视频网| 美女视频网站久久| 欧美日韩一区二区三区不卡 | 国产亚洲一本大道中文在线| 久久精品无码一区二区三区| 亚洲黄色性网站| 国产白丝精品91爽爽久久| 日韩影院在线观看| 欧美性感一类影片在线播放| 91麻豆视频网站| 欧美日韩精品是欧美日韩精品| 国产精品嫩草99a| 亚洲美女视频在线| 国产精品国产三级国产a| av电影在线不卡| 欧美日韩国产精品成人| 三级欧美韩日大片在线看| 老司机午夜精品| 成人开心网精品视频| 欧美日韩在线直播| 精品乱人伦小说| 国产精品理论在线观看| 一区二区三区欧美| 免费高清不卡av| 中文字幕av在线一区二区三区| 亚洲视频在线一区| 欧美日韩情趣电影| 中文字幕免费观看一区| 久久久久国产精品麻豆ai换脸| 成人激情文学综合网| 欧美放荡的少妇| 国产精品亚洲一区二区三区妖精| 91丨porny丨最新| 激情综合色播五月| 国产午夜亚洲精品午夜鲁丝片 | 欧美大白屁股肥臀xxxxxx| 日韩视频免费观看高清完整版在线观看 | 日韩主播视频在线| 亚洲大片在线观看| 久久国产精品72免费观看| 国产丶欧美丶日本不卡视频| 久久精品人人做| 日韩精品91亚洲二区在线观看 | 日韩成人午夜精品| 99久久精品国产精品久久| 激情综合五月婷婷| 亚洲欧美日韩小说| 懂色一区二区三区免费观看| 欧美精品亚洲二区| 亚洲精品视频在线观看免费| 欧美精品在线视频| 亚洲精品伦理在线| 7777精品伊人久久久大香线蕉最新版| 亚洲精品伦理在线| 亚洲成人av电影| 国产精品国产三级国产有无不卡| 国产日韩欧美麻豆| 欧美高清你懂得| 日韩一区欧美一区| 久久久午夜精品| 美女一区二区视频| 亚洲另类在线制服丝袜| 亚洲精品乱码久久久久久| 精品福利一区二区三区| 欧美国产一区二区在线观看 | 日本视频免费一区| 夜夜精品视频一区二区| 成人性生交大片| 蜜桃视频在线一区| 欧美日韩国产一区二区三区地区| 久久精品国产网站| 在线成人免费视频| 国产精品毛片大码女人| 精品国产精品网麻豆系列| 免费看日韩a级影片| 一个色综合网站| 欧美人妖巨大在线| 欧美午夜电影网| 日本中文字幕不卡| 亚洲精品视频在线观看网站| 91久久国产综合久久| 亚洲私人黄色宅男| 自拍视频在线观看一区二区| av综合在线播放| 成人app网站| 亚洲男女一区二区三区| 国产精品无人区| 色综合中文综合网| 国产成人午夜电影网| 色综合久久88色综合天天免费| 国产成人自拍网| 日韩一区在线免费观看| 国产免费久久精品| 色噜噜狠狠成人中文综合| 色综合激情久久| 亚洲电影中文字幕在线观看| 丝袜亚洲另类欧美综合| 亚洲第一福利一区| 日韩小视频在线观看专区| 91精品国产色综合久久不卡电影 | 国产日韩精品一区| 国产清纯美女被跳蛋高潮一区二区久久w | 国产一区二区三区在线观看免费| 青娱乐精品视频| 国产精品成人一区二区艾草| 日韩视频免费观看高清完整版在线观看 | 色偷偷久久一区二区三区| av动漫一区二区| 亚洲电影中文字幕在线观看| 丝袜国产日韩另类美女| 中文字幕免费一区| 欧美一区午夜视频在线观看 | 欧美三级韩国三级日本三斤| 久久五月婷婷丁香社区|