之前一段時間面試,包括朋友們的面試中經常會問到一個需求:
如果用戶好不容易翻到了第幾十、幾百乃至幾千條時,難道要用戶再重頭開始?
所以需求方要求用戶在一個列表頁瀏覽時,點擊一個列表進入詳情頁,返回要求記錄用戶剛剛瀏覽的位置,而不是重新刷新頁面到了頁面頂部。
被問到之后就在想如何實現(ps:因為我覺得不僅是要應付面試,同時這個需求真的太常見了,我竟然不會。),后來想了幾個解決方案:
1、將瀏覽時的滾動位置傳到服務器端,加載頁面時根據用戶來取最后瀏覽的位置,感覺參數滿天飛(我討厭參數...)
2、將詳情頁通過 <iframe> 或者 彈窗 引到當前頁,通過操作關閉當前彈窗(沒有參數,但要在當前頁搞來搞去,既不美觀又不實用)
3、保存頁面的值,當然就想到 cookie 了,將瀏覽時的滾動高度(位置)存到 cookie 里,進到這個頁面再取。不過想想銷毀的時機不好確定也就放棄了。
4、通過 H5 本地存儲的方式將數據存起來,需要時取值(沒用過) cookie 不能用,還有 localStorage 和 sessionStorage
localStorage和sessionStorage一樣都是用來存儲客戶端臨時信息的對象。
- localStorage - 生命周期是永久,這意味着除非用戶顯示在瀏覽器提供的 UI 上清除 localStorage 信息,否則這些信息將永遠存在。
- sessionStorage - 生命周期為當前窗口或標簽頁,一旦窗口或標簽頁被永久關閉了,那么所有通過sessionStorage存儲的數據也就被清空了。
不同瀏覽器無法共享localStorage或sessionStorage中的信息。相同瀏覽器的不同頁面間可以共享相同的localStorage(頁面屬於相同域名和端口),但是不同頁面或標簽頁間無法共享sessionStorage的信息。
這里需要注意的是,頁面及標簽頁僅指頂級窗口,如果一個標簽頁包含多個iframe標簽且他們屬於同源頁面,那么他們之間是可以共享sessionStorage的。
詳細了解:http://adamed.iteye.com/blog/1698740
HTML 5 Web 存儲(w3school):http://www.w3school.com.cn/html5/html_5_webstorage.asp
重點
按步驟:
頁面滾動,將滾動位置存到session中
// 滾動時 sessionStorage.setItem(key,value) 保存滾動位置
$(window).scroll(function(){
if($(document).scrollTop()!=0){
sessionStorage.setItem("offsetTop", $(window).scrollTop());//保存滾動位置
}
});
再次進到頁面中,到session中取出上次保存的瀏覽位置,並滾動到對應位置
// onload時 sessionStorage.getItem(key) 取出並滾動到上次保存位置
window.onload = function()
{
var _offset = sessionStorage.getItem("offsetTop");
$(document).scrollTop(_offset);
};
