場景:經過popstate事件解決了瀏覽器後退時未退出本文件,點擊一次後退後,瀏覽器的前進按鈕的狀態是可點,此時仍然是在處理後退的邏輯,致使頁面混亂。瀏覽器
措施:1.在第一次執行pushHistory方法時插入的歷史記錄,點擊後退,能經過popstate觸發時state屬性值進行判斷,若爲null,則點擊是後退,如果對象中包含插入歷史記錄的信息,則未前進操做。spa
2.插入多條歷史記錄時,並處在第一次插入歷史記錄幀以後,沒法判斷是前進操做仍是後退操做。顯然,popstate事件並不適用。經嘗試後,改成hashchange事件,hashchange
事件對象中包含變化先後的連接地址(oldURL和newURL),將每次的pushHistory中添加錨點,獲取錨點值大小來判斷前進或者後退。code
3.點擊前進時,不執行後退的邏輯,而且頁面不能前進,只能去back()。同理,刷新時,頁面要go(-n)。對象
代碼以下:blog
var newURL=''; var oldURL=''; var isForward=false;//是不是前進 if (window.location.hash !== "") {//頁面刷新時,根據hash判斷回到頁面最開始狀態 var i=Number(window.location.hash.replace('#','')); window.history.go(1-i); isForward=true; } window.addEventListener('hashchange', function(e) { newURL=e.newURL.slice(-2,-1)=='#'?e.newURL.slice(-1):0; oldURL=e.oldURL.slice(-2,-1)=='#'?e.oldURL.slice(-1):0; if(!isForward){ if(parseInt(newURL)<parseInt(oldURL)){ ..........//單頁面中業務後退邏輯 }else { //前進時不操做 window.history.back(); isForward=true; var dia=$.dialog({ title:'提示', content:'頁面內不能前進', button:["關閉"] }); } }else { isForward=false; } }, false);