js取消浏览器对页面滚动条位置的记录

问题描述:

项目提出bug,当正在浏览页面的时候点击返回首页此时页面停留在页面顶部,然后立即刷新,页面会回到刚才浏览的部分。
期望:当浏览时刷新可以保存滑动条的位置但是当点击首页的时候不需要保存

问题出现原因:

浏览器在导航跳转和通过 History API 创建历史记录时,都会记录当前的垂直滚动距离,在重新访问时恢复这个距离。

问题解决办法:

1、初级版

$(".toIndex").click(function(){
    if ('scrollRestoration' in history) {
        history.scrollRestoration = 'manual';
    }
});//去除默认的滚动恢复行为
var recoverAuto = function () {
    if ('scrollRestoration' in history) {
        history.scrollRestoration = 'auto';
    }
};
setTimeout(recoverAuto,1800);//回复默认的滚动恢复行为

给返回首页添加点击事件,关闭记录当前的垂直滚动距离浏览器行为。但是这样会导致之后也无法保存滚动条的位置,所以后面加了一个定时器,在1.8s之后恢复浏览器的记录行为。
缺点:如果用户在1.8s之内浏览页面并刷新,不会回到浏览位置。

2、 终极方案(从根本上解决问题,无bug)

$(".toIndex").click(function(){
    $('body,html').scrollTop(0);
});//返回首页的同时将滑动条置顶

给返回首页添加点击事件,返回首页的同时将滑动条置顶,让浏览器记录一个在顶部的历史记录。


相关知识

平常使用浏览器的后退功能时,常常会发现返回的页面滚动到了之前的位置,而不是简单的回到顶部。这是由于浏览器在导航跳转和通过 History API 创建历史记录时,都会记录当前的垂直滚动距离,在重新访问时恢复这个距离。值得一提的是,在 HTML History Spec中并没有强制要求浏览器记录与恢复滚动距离。

引入新的 API
为了让开发者能够通过编程方式关闭这一浏览器行为,《浏览器恢复滚动提案》引入了新的 API:

if ('scrollRestoration' in history) {
    // 默认值为'auto'
    history.scrollRestoration = 'manual';
}

更为清爽的浏览体验,请移步我的个人博客
天心天地生的个人博客

### 解决 UniApp ECharts 图表滚动条与系统手势冲突 在处理UniApp中的ECharts图表时,当启用滚动条功能可能会遇到与设备系统的默认手势操作发生冲突的情况。为了有效解决这一问题,可以采取以下几种方法: #### 方法一:禁用页面滑动手势 通过设置`<scroll-view>`组件属性来控制页面整体的可滑动区域,从而避免其影响到ECharts内部的手势响应。 ```html <!-- 设置 scroll-y="false" 来阻止上下方向上的全局滑动 --> <scroll-view :scroll-y="false"> <!-- ECharts 容器 --> </scroll-view> ``` 这种方法简单直接,但是会使得整个页面失去纵向滚动能力,在某些场景下可能不是最优解[^1]。 #### 方法二:调整 ECharts 配置项 针对具体图表配置,可以通过修改`grid`参数以及开启或关闭特定交互方式来减少误触几率。 ```javascript option = { grid: { containLabel: true }, xAxis: [{ type: 'category', boundaryGap: false }], yAxis: [{ type: 'value' }], series: [ // 数据系列... ], dataZoom: [{ show: true, startValue: '2023-08', endValue: '2023-10' }] }; ``` 这里特别需要注意的是`dataZoom`选项,它允许用户自定义缩放和平移范围,合理利用此特性可以在一定程度上缓解冲突现象[^2]。 #### 方法三:监听并拦截触摸事件 更进一步的做法是在JavaScript层面捕获原始touch事件,并根据实际需求决定是否传递给底层处理器继续执行,默认情况下浏览器会对这些动作做出相应反应(比如回退历史记录),而这正是造成干扰的主要原因之一。 ```javascript // 给 chart 实例绑定 touchstart 和 touchmove 的回调函数 chart.getZr().on('globalout', function (params) { if (!isInChartArea(params)) return; document.body.style.overflowY = "hidden"; // 锁定页面防止跟随移动 params.event.preventDefault(); // 取消冒泡机制 }); function isInChartArea(eventParams){ const pointInPixel = [eventParams.offsetX, eventParams.offsetY]; return chart.containPixel('grid', pointInPixel); } ``` 上述代码片段展示了如何判断手指点击位置是否位于图表区域内,如果是则临时锁定屏幕滚动行为直至释放接触为止[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值