關於window.location.replace()以及history.go()方法

需求

當我們從商品列表界面點擊商品進入商品編輯界面後,我們點擊保存按鈕,再跳轉回商品列表界面。但此時會有一個問題,在商品列表界面返回上一界面,會返回到商品編輯界面。而我們希望它能返回到它真正的上一級,也就是我如果在主頁點擊該界面,編輯商品完成後,我應該返回主界面。

模擬

定義三個界面,home.html表示主界面,index.html表示商品列表界面,index1.html表示商品編輯界面,如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>主頁</title>
	</head>
	<body>
		<h1>主頁</h1>
		<a href="./index.html">商品列表</a>
	</body>
</html>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>商品列表</title>
<script>
function replaceDoc(){
	window.location.replace("./index1.html")
}
</script>
</head>
<body>
<h1>商品列表界面</h1>
<input type="button" value="編輯" onclick="replaceDoc()">
<a href="./index1.html">編輯</a>

</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<script>
	// function replaceDoc(){
	// 	window.location.replace("./index.html")
	// }
	function replaceDoc(){
		history.go(-1)
	}
	</script>
	<body>
		<h1>商品編輯界面</h1>
		<a href="./index.html">完成</a>
		<br>
		<input type="button" value="完成replace版" onclick="replaceDoc()">
	</body>
</html>

問題引出

初始時,我是使用在商品編輯界面採用repalce()方法,將編輯界面直接重置爲商品列表界面,但是發現我點擊返回時,回到的依舊是商品列表界面。

問題分析

replace()方法是用參數中的url來替換本界面,於是在調用棧中,將當前界面置換爲了新界面。因爲我在控制檯中使用window.history.length發現調用棧的長度未發生變化,也就是說,此時並沒有產生新的跳轉,而是在請求棧中將本棧中的url值直接替換爲了參數中的url值。
所以我們在當前這個編輯界面,此時它replace爲另一個界面,它的前一個還是商品列表界面,所以就造成了我們點擊返回,又加載了一遍列表界面,因爲此時棧中有兩個這個列表界面,返回後就又回到了該界面。
所以我這邊採用history.go(-1),將界面返回到棧的前一個,那麼在此界面就可以正確地返回它的前一個了。

結論

replace是將界面置換爲新的界面,在調用棧中是將此棧中界面置換,而history.go()是加載到歷史界面中的某一個具體界面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章