我无法解决这个问题,因此作为一种解决方法,我编写了一个返回承诺的函数。这个承诺在弹性滚动完成后得到解决。
当用户单击“下一篇文章”时,我会加载文章,但我会等到 promise 解决后才执行 DOM 操作并调用scrollTo
. 这对我很有效。
function waitForElasticScroll() {
// If user scrolls part viewport and clicks while elastic scroll
// has not fully "returned", scroll position will get messed up in Chrome.
// Our workaround is to wait for elastic scroll to finish before transitioning.
// rAF calls help avoid unnecessary layout.
return new Promise(function (resolve) {
window.requestAnimationFrame(function () {
var maxScrollY = document.body.scrollHeight - window.innerHeight;
function isReady() {
var scrollY = window.scrollY || window.pageYOffset;
return scrollY <= maxScrollY;
}
function resolveIfReady() {
if (isReady()) {
resolve();
} else {
window.requestAnimationFrame(resolveIfReady);
}
}
resolveIfReady();
});
});
}
我将Bluebird用于 Promises,将动画框架用于 rAF polyfill。