js记录上次滚动到的地方,点击详情后返回到之前的位置,非vue模式

1,501 阅读2分钟

我这个后台phper又来优化前端的bug了

问题描述:用户在商品列表页面无限加载分页后点击详情查看,再返回列表时数据被重置了,要重头再来~内心崩溃啊

解决:让开一下,我php出来搞搞你们前端的东西,你们让让路哈。

找来一个保存当前滚动状态的代码(phper必须要找,不像你们前端随便动手就写好了!)

//滚动时保存滚动位置
$(window).scroll(function(){
  if($(document).scrollTop()!=0){
    sessionStorage.setItem("offsetTop", $(window).scrollTop());
  }
});
//onload时,取出并滚动到上次保存位置
window.onload = function(){
  var offset = sessionStorage.getItem("offsetTop");
  $(document).scrollTop(offset);
};


//页面加载完成时,取出并滚动到上次保存位置
$(document).ready(function(){
    var offset = sessionStorage.getItem("offsetTop");
    console.log('offsetTop',offset )
    $(document).scrollTop(offset);
});

然后根据自己的项目搞就是了。

先说说逻辑吧:

常规:用户滑动加载数据→激动的手开始点击进入详情→购买或者不喜欢要返回列表→从头开始一页一页往下翻找~(内心崩溃

graph TD
浏览加载数据 -->进入详情浏览 --> 返回列表浏览 --> 重头开始到内心崩溃

优化后:用户滑动加载数据→激动的点后开始点击想进入详情→js保存当前滚动状态、数据→购买或者不喜欢要返回列表→从刚刚的位置开始一页一页往下翻找(表面平静,但是乐开花了)

graph TD
浏览加载数据 -->进入详情浏览 --> 返回列表浏览 --> 从上次的位置开始-->其实已经笑开花了

js逻辑实现:点击时保存当前分页、滚动位置、已加载数据、其他(比如关键词、排序等搜索条件)→用户潇洒时间→返回列表时查询是否有上次是浏览状态,没有就从头开始,有则加载上次的缓存继续从上次开始的地方浏览。

关键点:滚动位置、分页保存、旧数据保存、过期设置(按需来)

给个事件的案例:

//点击的时候存储一下数据
var status = {
    pt:pt,
    keyword:keyword,
    sort:sort,
    cpage: cpage,//当前分页
    scrollTop: $(window).scrollTop(),//当前滚动位置
    data:$(".wy-pro-list").html(),//当前旧数据(5M以内)
}

//console.log('aaaa',JSON.stringify(status))

sessionStorage.setItem('key_status'JSON.stringify(status));


//初始化页面检查:
var gstatus = sessionStorage.getItem('key_status');
if (gstatus){
    gstatus = JSON.parse(gstatus);
    pt = gstatus.pt;
    keyword = gstatus.keyword;
    sort = gstatus.sort;
    cpage = gstatus.cpage;

    var offset =  gstatus.scrollTop;
    //旧数据还原
    $(".wy-pro-list").html(gstatus.data);
    //滚动位置跟上哈
    $(document).scrollTop(offset);
    //加载新的数据
    addItem();//里面怎么ajax就不用看了吧?
}else {
//从零开始咯
    addItem();
}

妙哉,实测很ok!

move.gif 这时候一堆前端大佬过滤哼唧一下表示“就这?”,他们不知道一个phper只会jq的人写这个是有成就感的。