javascript - 如何防止用户中断 window.scrollTo()?
问题描述
我有一段使用 的代码window.scrollTo()
,我想阻止用户中断滚动直到它完成。
let isMoving = false;
const scroll_keys = { 37: 1, 38: 1, 39: 1, 40: 1 };
preventDefault = e => {
console.log(isMoving);
if (!isMoving) return;
e = e || window.event;
if (e.preventDefault) e.preventDefault();
e.returnValue = false;
};
preventDefaultForScrollKeys = e => {
if (!isMoving) return;
if (keys[e.keyCode]) {
preventDefault(e);
return false;
}
};
document.addEventListener('wheel', preventDefault, { passive: false });
document.addEventListener('DOMMouseScroll', preventDefault, { passive: false });
document.addEventListener('scroll', preventDefault, { passive: false });
window.ontouchmove = preventDefault;
document.onkeydown = preventDefaultForScrollKeys;
function scrollTo(offset, callback) {
const onScroll = () => {
const scrollTop = window.scrollTop || window.pageYOffset;
if (scrollTop === offset) {
window.removeEventListener('scroll', onScroll);
callback();
}
};
window.addEventListener('scroll', onScroll);
onScroll();
window.scrollTo({
top: offset,
behavior: 'smooth',
});
}
我isMoving = true
在调用之前window.scrollTo
设置,并在回调中将其设置回 false,如下所示:
isMoving = true; scrollTo(0, () => { isMoving = false; });
我希望这可以完全防止用户中断滚动,但它不能正常工作。它似乎有效,但并非每次都有效,而且看起来很麻烦。
解决方案
推荐阅读
- python - InvalidArgumentError: indices[] = is not in: Re-training not starting after INFO:tensorflow:global_step/sec: 0
- azure-storage - 损坏的 azure sdk 无法识别本地存储
- python-3.x - 在python split函数上运行forloop时出错
- c# - 认证后将用户信息传递给反应组件
- php - 为什么 laravel 路由必须优先顺序,否则找不到页面?
- ios - iOS 中的 NFC 读取标签
- javascript - 带有固定标题的 scrollIntoView()
- mysql - 2个日期范围查询之间的MySql
- html - 使用 HTMLBody 进行条件格式化
- python - 当变量数量未知时插入 Sqlalchemy