解決Ajax框架下頁面回退重新整理問題

2021-12-30 00:17:26 字數 3772 閱讀 3541

如果使用firefox等瀏覽器訪問rms**時,我們可能會發現頁面之間的切換是通過ajax非同步請求實現的,同時頁面的url不會發生改變,雖然可以通過頁面上的按鈕通過ajax非同步請求實現回退重新整理,但是對於瀏覽器前進和後退不能支援,每當重新整理與後退之後,頁面都會退到最開始的歡迎頁面。ajax可以實現頁面的區域性重新整理,可以做到非常好的資料載入效果,給使用者帶來非常良好的體驗,但是ajax不能在瀏覽器的歷史會話中保留記錄,當你點開乙個頁面,ajax各種資料載入非常快捷,例如乙個列表頁面可以用非同步載入來翻頁,但是如果使用者一不小心重新整理了頁面,那麼頁碼就得重新開始計算,一旦使用者改變了會話狀態(瀏覽器的前進、後退、重新整理),那麼ajax就會丟失相關的資料。

傳統的ajax存在如下的問題:

1、可以無重新整理改變頁面內容,但無法改變頁面url

2、不能支援通過**直接訪問系統某一模組,必須進過點按操作

3、回退、重新整理必須開發人員自己第一,既給開發人員增加了工作量,又不符合使用者習慣

4、進而瀏覽器引入了onhashchange的介面,不支援的瀏覽器只能定時去判斷hash是否改變

5、但這種方式對搜尋引擎很不友好

使用技術

為了解決傳統ajax帶來的問題,html5裡引入了新的api,即:history.pushstate,history.replacestate

可以通過pushstate和replacestate介面操作瀏覽器歷史,並且改變當前頁面的url。

pushstate是將指定的url新增到瀏覽器歷史裡,replacestate是將指定的url替換當前的url。

將當前url和history.state加入到history中,並把新的state和url新增到當前。不會造成頁面重新整理。

state:與要跳轉到的url對應的狀態資訊。

title:標題(現在是被忽略,未作處理)。

url:要跳轉到的url位址,不能跨域。

history.replacestate()操作類似於history.pushstate(),不同之處在於replacestate()方法會修改當前歷史記錄條目而並非建立新的條目。

state:與要跳轉到的url對應的狀態資訊。

title:標題(現在是被忽略,未作處理)。

url:要跳轉到的url位址,不能跨域。

addeventlistener是乙個偵聽事件並處理相應的函式。

type:事件的型別。

listener:偵聽到事件後處理事件的函式。此函式必須接受 event物件作為其唯一的引數,並且不能返回任何結果。

解決方法

由於ajax無重新整理改變頁面內容的,所以頁面的url始終是不變的,為了區分頁面上的各個不同內容,首先需要重新定義一下各個頁面的url,因為rms**多使用$.post非同步請求,我們可以用url記錄post請求的各個引數(請求位址、傳遞引數),當瀏覽器進行重新整理、回退操作時,根據url記錄的資訊自動傳送post請求,進入對應頁面,從而實現希望的功能。

定義url語法:

已如下位址為例:「http://localhost/rms_hold/index.php/home/index/loadhomepage#/rms_hold/index.php/home/resourcerequest/getrequestpage@apply_type=1&resource_name=adm_bizcard!1」

「http://localhost/rms_hold/index.php/home/index/loadhomepage」是原先頁面的url,如果在問題解決之前在rms**上進行任何點按操作,**一直不會有任何變動。現在我們使用「#」分割**,「#」之後就是我們所記錄的ajax請求「/rms_hold/index.php/home/resourcerequest/getrequestpage」是請求的位址,它由「#」與「@」分割,而在「@」與「!」之間的這是發向請求位址的各個引數,「apply_type=1」與「resource_name=adm_bizcard」由「&」進行分割。

重新整理、回退監聽處理:

if (history.pushstate)

});back_ajax_mod_url();

back_ajax_post();

}如以上**所示,window物件上提供了onpopstate事件,可以使用addeventlistener方法監聽onpopstate事件,每當url因為瀏覽器回退時都會對得到的url在back_ajax_mod_url()back_ajax_post()函式中進行解析、處理,而當瀏覽器重新整理時,根據history.pushstate的返回值不空,依然會對得到的url在back_ajax_mod_url()back_ajax_post()函式中進行解析、處理。

對外介面:

function back_ajax_mod_url(), title,location.href.split("#")[0] + "#"+ url_ajax);

}}介紹一下back_ajax_mod_url()函式,它與陣列ajaxback_url組成對外介面,ajaxback_url是乙個全域性陣列,用來存放需要加入到history中的url,然後由back_ajax_mod_url()函式在無頁面重新整理的情況下將當前url和history.state加入到history中。

$("#reporttable tbody").on("click", "trtd img[alt = 'detail']",

function() ,

function(data) );

});以上函式是rms系統裡的乙個ajax非同步請求事件,會造成頁面無重新整理變化,加粗部分就是我們提供的對外介面,使用該介面後在history中會產生一條新的url用來記錄達到該頁面的post方法。

url解析處理器:

如下面函式所示back_ajax_post()為rms系統的url解析處理器,根據之前提到的url語法,讀出頁面上改變內容的ajax請求,並且自動傳送ajax請求,獲取需要的頁面

function back_ajax_post() ;

} else

var get_resource_href =location.href;

if(get_resource_href.indexof("!") != -1) ;

if(get_resource_href.indexof("resource_name=") != -1) else if(get_resource_href.indexof("report_name=") != -1) ;

if (!post_page_index ||$("#personalinfo").length <= 0)

$.ajax( else ;

},error: function(res) ,

});}

//for request page next&back

if (post_page_index) );

$(this).parent('li').parents('li').addclass('active open');

return false;

} else

});$("ul.page-sidebar-menuli").not(".open").find("ul").hide();}}

Struts框架下Ajax傳送中文亂碼問題的解決

今天在使用ajax向伺服器端傳送中文資料時,出現亂碼,解決辦法參考 ajax.js內容如下 jsp檔案如下 function createtype chat vinews.do var params method createtypeing name name descript descript s...

VUE框架下FPS低解決方式

最近客戶發現fps很低,大模型載入才4,5fps 但是之前的用純js的版本寫的用例表現卻很好,到30左右,差別這麼大 也看了很多vue優化的例子,後發現,vue中的資料繫結這裡真的是需要注意,之前為了方便,直接把一些跟模型的資料繫結到data上,一旦改變,vue的監聽會多次呼叫getter,sett...

iframe框架下的子父級頁面監控頁面關閉事件

兩種方式 其一 var jq top.jquery jq tt tabs return true 阻止關閉 若當前頁為收銀確認則預設選中 if jq tt tabs exists 此處為title名 其二 window unload function evt if evt window.onbefo...