gpt4 book ai didi

javascript - 等到scrollTo完成后再运行命令

转载 作者:行者123 更新时间:2023-12-02 16:06:00 24 4
gpt4 key购买 nike

我有一个 AngularJS 应用程序,并且有一个平滑滚动指令来强制页面滚动到底部。我希望该命令仅在滚动完成后运行。您可以看到,此时我运行滚动函数,然后运行 ​​$('#comment-input').focus(); 以聚焦于某个元素。我想更改它,以便仅在滚动之后运行。我知道我需要实现回调,但我不知道在哪里实现它。

(function() {

var app = angular.module('myApp');

app.service('anchorSmoothScroll', function(){

this.scrollTo = function(eID) {

// This scrolling function
// is from http://www.itnewb.com/tutorial/Creating-the-Smooth-Scroll-Effect-with-JavaScript

var startY = currentYPosition();
var stopY = elmYPosition(eID);
var distance = stopY > startY ? stopY - startY : startY - stopY;
if (distance < 100) {
scrollTo(0, stopY); return;
}
var speed = Math.round(distance / 100);
if (speed >= 20) speed = 20;
var step = Math.round(distance / 25);
var leapY = stopY > startY ? startY + step : startY - step;
var timer = 0;
if (stopY > startY) {
for ( var i=startY; i<stopY; i+=step ) {
setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
leapY += step; if (leapY > stopY) leapY = stopY; timer++;
} return;
}
for ( var i=startY; i>stopY; i-=step ) {
setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
leapY -= step; if (leapY < stopY) leapY = stopY; timer++;
}

function currentYPosition() {
// Firefox, Chrome, Opera, Safari
if (self.pageYOffset) return self.pageYOffset;
// Internet Explorer 6 - standards mode
if (document.documentElement && document.documentElement.scrollTop)
return document.documentElement.scrollTop;
// Internet Explorer 6, 7 and 8
if (document.body.scrollTop) return document.body.scrollTop;
return 0;
}

function elmYPosition(eID) {
var elm = document.getElementById(eID);
var y = elm.offsetTop;
var node = elm;
while (node.offsetParent && node.offsetParent != document.body) {
node = node.offsetParent;
y += node.offsetTop;
} return y;
}

};

});

app.controller('TextareaController', ['$scope','$location', 'anchorSmoothScroll',
function($scope, $location, anchorSmoothScroll) {

$scope.gotoElement = function (eID){
// set the location.hash to the id of
// the element you wish to scroll to.
$location.hash('bottom-div');

// call $anchorScroll()
anchorSmoothScroll.scrollTo(eID);

$('#comment-input').focus();

};

}]);

}());

最佳答案

我建议创建一个返回 promise 并避免循环/计时器的函数。然后你可以像这样访问该函数:

    smoothScroll(element).then(() => {
//Execute something when scrolling has finished
});

smoothScroll 函数可以这样定义,而无需使用大量计时器(实际定义的计时器只是在滚动失败时 reject() promise 由于某种原因,例如用户交互):

function smoothScroll(elem, offset = 0) {
const rect = elem.getBoundingClientRect();
let targetPosition = Math.floor(rect.top + self.pageYOffset + offset);
window.scrollTo({
top: targetPosition,
behavior: 'smooth'
});

return new Promise((resolve, reject) => {
const failed = setTimeout(() => {
reject();
}, 2000);

const scrollHandler = () => {
if (self.pageYOffset === targetPosition) {
window.removeEventListener("scroll", scrollHandler);
clearTimeout(failed);
resolve();
}
};
if (self.pageYOffset === targetPosition) {
clearTimeout(failed);
resolve();
} else {
window.addEventListener("scroll", scrollHandler);
elem.getBoundingClientRect();
}
});
}

我还在这支笔中制作了一个工作示例:https://codepen.io/familjenpersson/pen/bQeEBX

关于javascript - 等到scrollTo完成后再运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30727365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com