如題,最近作一個項目時,因爲頁面太長,跳轉後在返回又回到初始位置,不利於用戶體驗,須要每次返回到用戶離開該頁面是的位置。因爲是移動端項目,使用了移動端的套ui框架framework7,自己框架的機制是支持返回原始位置的,可是因爲涉及到權限及安全等方面的問題,沒有采用framework7的路由機制,因此這個就必須本身寫了。javascript
個人想法是給每一個頁面一個data-page屬性用於保存這個頁面的名字,而後每次在頁面卸載即離開的時候獲取滾動條的位置,而後將頁面的名稱作爲屬性名保存起來,讓後將其push到一個數組中,保存到cookie中,到頁面再次加載時,將其獲取到,而後將頁面的滾動條位置調整到保存的位置,這樣就能夠實現了,固然其中有不少細節的東西,在這裏就不作贅述了,下面直接貼上代碼(歡迎大神點評)html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <title>Title</title> <style> div { width:300px; height:300px; background:greenyellow; margin:200px auto; overflow-y: scroll; } #link{ color: #fff; } </style> </head> <body> <div id="box" data-page="index" class="pages"> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <a href="後退刷新測試1.html" id="link">點擊到第一個頁面</a> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> <p>這是測試文字</p> </div> <script type="text/javascript" src="originBack.js"></script> </body> </html>
這裏我是模擬了framework7的頁面結構,沒有用來瀏覽器的滾動條,用一個div設置overflow:scroll來模擬頁面的滾動條。在須要應用的頁面直接引入js文件便可java
/** * Created by tianjin on 2017/7/18. */ var pages = document.getElementsByClassName('pages')[0];//獲取需滾動的頁面結構 var pageName = pages.getAttribute('data-page');//獲取頁面的data-page屬性,該屬性是頁面的名稱,經過該屬性判斷打開的是那個頁面,從而獲取其scrollTOp的值 /** * 初始化頁面,看cookie中是否保存有scrollTop屬性 * 若是有,則不作任何處理 * 若是沒有,則添加一個scrollTop屬性到cookie並賦值空數字 * */ !function () {//自執行的頁面初始化方程 var aCookie = document.cookie.split("; ");//獲取cookie並以‘;’爲標識將其轉化爲數組 for (var i = 0;i < aCookie.length;i++) {//循環數組中的每一項 var aCrumb = aCookie[i].split("=");//將每一項以等號爲分割標識轉化成數組 if ('scrollTop' == aCrumb[0]) {//判斷數組的第一項,即cookie的屬性名是不是'scrollTop',即判斷cookie中是否有scrollTop屬性 return false//若是有,則不作任何處理,結束程序 } }//若是判斷完成以後沒有scrollTop屬性 var arr = [];//則初始化一個空數組 var arrCookie = JSON.stringify(arr);//將該書組轉化成字符串格式,由於cookie中展現是以字符串形式的 document.cookie ="scrollTop=" + arrCookie//將該字符串以屬性名爲scrollTop的存入cookie中 }(); /** * 定義設置cookie的方法SetCookie * 用來在每次頁面跳轉的時候重置cookie的scrollTop屬性 * */ function SetCookie(sName,sValue) {//設置cookie,sName爲cookie的屬性值,即爲scrollTop,sValue爲cookie的scrollTop的值 document.cookie = sName + "=" + sValue//設置cookie } /** * 定義獲取cookie的方法GetCookie * 用來在頁面加載是獲取cookie中的scrollTop的值並得到對應頁面離開時保存的scrollTop值 * 而後將頁面的scrollTop設置成該值 * */ function GetCookie(sName) {//獲取cookie,sName爲cookie的屬性值,即爲scrollTop, var aCookie = document.cookie.split("; ");//獲取cookie並以‘;’爲標識將其轉化爲數組 for (var i = 0;i < aCookie.length;i++) {//循環數組中的每一項 var aCrumb = aCookie[i].split("=");//將每一項以等號爲分割標識轉化成數組 if (sName == aCrumb[0]) {//判斷數組的第一項,即cookie的屬性名是否等於傳入的屬性名scrollTop var scrollTopObj = JSON.parse(aCrumb[1]);//若是是,則將該cookie轉換成JSON格式 return scrollTopObj//並將該JSON格式的數組返回 } } return null//若是不是scrollTop,則返回一個空對象 } /** * 定義頁面加載執行的函數,當頁面加載是執行該函數,並設置該頁面的scrollTop到離開該頁面是的位置 * */ function fnLoad() { var k = null;//定義一個k變量 var scrollTopArray = GetCookie('scrollTop');//執行GetCookie函數,並將其返回值保存在scrollTopArray中 for (var i = 0; i<scrollTopArray.length ; i++){//循環scrollTopArray數組 for (k in scrollTopArray[i]){//for in scrollTopArray中的沒一個對象 if (k == pageName){//判斷對象的名稱是否等於當前頁面的data-page屬性,即獲取當前頁面scrollTop的值 pages.scrollTop = scrollTopArray[i][k];//若是相等,則將當前頁面中的scrollTop設置成cookie中保存的scrollTop return false//並結束程序 } } } } /** * 定義頁面卸載,即離開該頁面時的方法 * 當離開頁面時,要將該頁面當前的scrollTop保存在cookie中 * */ function fnUnload() { var flag = false;//定義一個開關,做爲當前cookie中是否保存該頁面的scrollTop值做爲判斷 var scrollT = pages.scrollTop;//獲取當前頁面的scrollTop值 var obj = {};//建立一個對象用於保存當前對象的scrollTop的值 obj[pageName] = scrollT;//在上面對象的pageName屬性保存當前頁面的scrollTop的值 var cookieObj = document.cookie.split("; ");//獲取cookie並以‘;’爲標識將其轉化爲數組 for (var i = 0;i < cookieObj.length;i++) {//循環數組中的每一項 var aCrumb = cookieObj[i].split("=");//將每一項以等號爲分割標識轉化成數組 if (aCrumb[0] == 'scrollTop') {//判斷數組的第一項,即cookie的屬性名是否等於scrollTop var newArr = JSON.parse(aCrumb[1]);//若是相等,則將該屬性的值解析成JSON格式並保存在一個新數組newArr中 if (newArr.length == 0){//判斷該數組是否爲空數組 newArr.push(obj);//如過爲空,則將該頁面的scrollTop對象添加到數組中,並保存到cookie中 }else {//若是不相等 for (var j = 0 ;j<newArr.length ; j++){//若是不相等則循環該新數組 for ( t in newArr[j]){//for in 數組中的對象 if (t == pageName){//比較是否有屬性名和該頁面的pageName相等,若是有,則說明cookie中保存有該頁面的的scrollTop的值 newArr[j][t] = scrollT;//將原始的頁面的scrollTop的值替代成當前的scrollTop的值 flag = true//而後將開關的設置成true,關閉下方的將頁面的scrollTop對象從新添加到cookie中去 } } } if (!flag){//如過flag爲false,則說明cookie中沒有該頁面的scrollTop屬性,則將該頁面的scrollTop屬性添加到cookie中 if (newArr.length>30){//因爲cookie的保存大小有限,限制保存30條 newArr.shift();//若是cookie中保存的數量大於30天,將該數組的第一條刪除 newArr.push(obj)//而後在添加該頁面的scrollTop對象到數組中 }else { newArr.push(obj)//若是沒有到30條,則直接添加到數組中而後保存到cookie中 } } } var arrCookie = JSON.stringify(newArr);//將newArr轉化成字符串格式,由於cookie保存的是字符串格式 SetCookie('scrollTop',arrCookie);//執行SetCookie方法,將數組保存到cookie中 } } } window.onload = function () { fnLoad()//在頁面加載後執行fnLoad }; window.onunload = function () { fnUnload()//在頁面卸載前執行fnLoad };