我正在处理由第三方软件生成的网站,我无法真正更改或删除生成的任何 JavaScript。我遇到这个问题,每次用户单击导航按钮或忘记必填字段并单击“继续”时,页面都会自动滚动到顶部。现在我有这段代码,强制它滚动回任何有问题的元素(受到 stackoverflow 答案的启发,但不幸的是我再也找不到它了:(如果我找到它,将在此处链接它)
function scrollTo(element, timeMS=200, offset=0) {
const elementPosition = element.offsetTop;
const startPosition = scrollElementGlobal.scrollTop;
const scrollDist = (elementPosition + offset) - startPosition;
const startTime = performance.now();
function scrollStep(timestamp) {
const currentTime = timestamp - startTime;
const scrollProgress = Math.min(currentTime / timeMS, 1);
scrollElementGlobal.scrollTop = startPosition + scrollDist * scrollProgress
// currentScroll = scrollElementGlobal.scrollTop
if(scrollProgress < 1) {
requestAnimationFrame(scrollStep)
}
}
requestAnimationFrame(scrollStep)
}
我通过单击事件附加到按钮,基本上如下所示
continue_button.addEventListener('click', function() {
if(something_went_wrong) {
scrollTo(element_that_went_wrong)
return;
}
if(something_else_went_wrong) {
scrollTo(other_element_that_went_wrong)
return;
}
})
这在桌面上运行良好,但是在移动设备上,当方向改变时,它会有点中断(第一次单击它不会产生动画,并且会像默认行为一样自动滚动回页面顶部,第二次它会滚动,但页面将“闪烁”,因为用户会在一瞬间看到页面顶部的任何内容)。有什么办法可以解决这个问题吗?谢谢!
发现问题了。还有另一个
scrollTo
函数,它要么来自浏览器,要么由我们使用的第三方软件生成。将函数名称更改为其他名称,问题就消失了。