溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何通過history解決ajax不支持前進(jìn)/后退/刷新的問題

發(fā)布時(shí)間:2021-07-13 13:37:57 來源:億速云 閱讀:189 作者:小新 欄目:web開發(fā)

這篇文章主要介紹如何通過history解決ajax不支持前進(jìn)/后退/刷新的問題,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

前言:

現(xiàn)在前后端基本都是通過ajax實(shí)現(xiàn)前后端接口數(shù)據(jù)的交互,但是,ajax有個(gè)小小的劣勢(shì),即:不支持瀏覽器“后退”和“前進(jìn)“鍵。

但是,現(xiàn)在我們可以通過H5的histroy屬性 解決ajax在交互請(qǐng)求的這個(gè)小bug。

事件描述:

H5增加了一個(gè)事件window.onpopstate,當(dāng)用戶點(diǎn)擊那兩個(gè)按鈕就會(huì)觸 發(fā)這個(gè)事件。但是光檢測(cè)到這個(gè)事件是不夠的,還得能夠傳些參數(shù),也就是說返回到之前那個(gè)頁面的時(shí)候得知道那個(gè)頁面的pageIndex。通過 history的pushState方法可以做到,pushState(pageIndex)將當(dāng)前頁的pageIndex存起來,再返回到這個(gè) 頁面時(shí)獲取到這個(gè)pageIndex。

window.history.pushState描述:

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

state對(duì)象:是一個(gè)JavaScript對(duì)象,它關(guān)系到由pushState()方法創(chuàng)建出來的新的history實(shí)體。用以存儲(chǔ)關(guān)于你所要插入到歷史 記錄的條目的相關(guān)信息。State對(duì)象可以是任何Json字符串。因?yàn)閒irefox會(huì)使用用戶的硬盤來存取state對(duì)象,這個(gè)對(duì)象的最大存儲(chǔ)空間為640k。如果大于這個(gè)數(shù) 值,則pushState()方法會(huì)拋出一個(gè)異常。

title:firefox現(xiàn)在回忽略這個(gè)參數(shù),雖然它可能將來會(huì)被使用上。而現(xiàn)在最安全的使用方式是傳一個(gè)空字符串,以防止將來的修改。

url:用來傳遞新的history實(shí)體的URL,瀏覽器將不會(huì)在調(diào)用pushState()方法后加載這個(gè)URL。也許會(huì)過一會(huì)嘗試加載這個(gè)URL。比如在用戶重啟了瀏覽器后,新的url可以不是絕對(duì)路徑。如果是相對(duì)路徑,那么它會(huì)相對(duì)于現(xiàn)有的url。新的url必須和現(xiàn)有的url同域,否則pushState()將拋出異常。這個(gè)參數(shù)是選填的,如果為空,則會(huì)被置為document當(dāng)前的url。

直接貼代碼:

/**
 * Created: Aaron.
 * address: http://www.cnblogs.com/aaron-pan/
 */

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

(function($,window,undefined){
  var loadData={
    pageIndex:window.history.state===null?1:window.history.state.page,
    //pageIndex:0,
    init:function(){
      this.getData(this.pageIndex);
      this.nextPage();
    },
    getData:function(pageIndex){
      var that=this;
      $.ajax({
        type:'post',
        url:'./data/getMovices'+pageIndex+'.json',
        dataType:'json',
        async:false,
        success:function(data){
          that.renderDom(data);
        }
      })
    },
    renderDom:function(movies){
      var bookHtml=
        "<table>"+
        "<tr>"+
        "<th>電影</th>>"+
        "<th>導(dǎo)演</th>"+
        "<th>上映時(shí)間</th>"+
        "</tr>";
      for(var i=0;i<movies.length;i++){
        bookHtml +=
          "<tr>" +
          "  <td>" + movies[i].moviesName + "</td>" +
          "  <td><a>" + movies[i].moviesEditor + "</a></td>" +
          "  <td>" + movies[i].times + "</td>" +
          "</tr>";
      }
      bookHtml+="</table>";
      bookHtml +=
        "<button>上一頁</button>" +
        "<button class='nextPage'>下一頁</button>";
      $('body').html(bookHtml);
    },
    nextPage:function(){
      var that=this;
      $(document).on("click",".nextPage",function(){
        that.pageIndex++;
        that.getData(that.pageIndex);
        window.history.pushState({page:that.pageIndex},null,window.location.href);
        //后退and刷新回到首頁 window.history.replaceState({page:that.pageIndex},null,window.location.href);
      })
    },
  };
  loadData.init();
  window.addEventListener("popstate",function(event){
    var page=0;
    if(event.state!==null){
      page=event.state.page;
      console.log('page:'+page);
    }
    console.log('page:'+page);
    loadData.getData(page);
    loadData.pageIndex=page;
  })

})(jQuery,window,undefined);

通過直接在html頁面調(diào)用js文件就可看到運(yùn)行結(jié)果。

運(yùn)行結(jié)果:

如何通過history解決ajax不支持前進(jìn)/后退/刷新的問題

這樣就可以達(dá)到通過ajax進(jìn)行交互也能實(shí)現(xiàn)監(jiān)聽前進(jìn)/后臺(tái)/刷新的功能了。

附瀏覽器兼容性:

如何通過history解決ajax不支持前進(jìn)/后退/刷新的問題

以上是“如何通過history解決ajax不支持前進(jìn)/后退/刷新的問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI