Javascript Angularjs:当页面加载时,获得正确偏移值的正确方法是什么 问题:

Javascript Angularjs:当页面加载时,获得正确偏移值的正确方法是什么 问题:,javascript,jquery,angularjs,angularjs-directive,angularjs-ng-repeat,Javascript,Jquery,Angularjs,Angularjs Directive,Angularjs Ng Repeat,当页面刚刚加载时,我无法获得DOM元素的正确顶部偏移值 我正在处理的项目需要在页面刚加载时获取几个DOM元素的offsetTop值。 原因是我需要根据$window的高度和它们在网页上的初始位置重新定位几个DOM元素。 如果DOM元素一直在页面下方,我想在页面底部放置一个固定的条,以指示用户还有更多,但您需要向下滚动才能看到它 调试阶段: 我尝试过的方法: angular.element就绪事件和angular$viewContentLoaded事件 下面是我获取元素偏移量的代码片段 angul

当页面刚刚加载时,我无法获得DOM元素的正确顶部偏移值

我正在处理的项目需要在页面刚加载时获取几个DOM元素的offsetTop值。 原因是我需要根据$window的高度和它们在网页上的初始位置重新定位几个DOM元素。 如果DOM元素一直在页面下方,我想在页面底部放置一个固定的条,以指示用户还有更多,但您需要向下滚动才能看到它

调试阶段: 我尝试过的方法:

angular.element就绪事件和angular$viewContentLoaded事件 下面是我获取元素偏移量的代码片段

angular.element(document).ready(function(){
    var elem = angular.element(document.getElementById('test-element');
    console.log(elem[0].getBoundingClientRect().top;
    console.log(elem[0].offsetTop);
    console.log(elem.offset().top);
});

以上所有内容都将打印错误的元素偏移量。然后,我创建一个超时函数来测试同一元素的offsetTop值,这将产生正确的offsetTop

$timeout(function(){
    var elem = angular.element(document.getElementById('test-element');
    console.log(elem[0].getBoundingClientRect().top;
    console.log(elem[0].offsetTop);
    console.log(elem.offset().top);       
},100);
基本上,timeout函数等待100ms读取同一元素的顶部偏移量,这会给我一个正确的偏移量

假设: 我的假设是为什么会发生这种情况,因为:

我使用ngRepeat生成一个表。加载页面时,从数据库中获取表的内容

$viewContentLoaded和angular.element ready事件在ngRepeat渲染其内容之前激发。这是一个可能的原因,因为在$viewContentLoaded/ready事件函数中获取偏移量时,它还不知道ngRepeat表的高度/偏移量

$timeout函数之所以能够获得正确的顶部偏移量,是因为$timeout函数执行其代码时,ngRepeat完成其工作,并且网页上的所有内容都处于稳定状态

$timeout函数和$viewContentLoaded/ready事件之间存在一个计时,它将为我提供正确的偏移量值

问题: 关于ngRepeat/$viewContentLoaded/ready的假设是否正确

当页面刚刚加载时,获取DOM元素顶部偏移量的正确方法是什么? 或者,获取正确偏移量的正确事件是什么

这是对问题的详细描述。我希望我说清楚了。我为任何英语语法错误感到抱歉。 非常感谢。

回答2:

getBoundingClientRect相对于当前滚动位置,并将随着页面滚动而更改。因此,要查看元素是否在当前视口之外,可以执行以下操作:

function isOffscreen(el) {
    var rect = el.getBoundingClientRect();
    return (rect.bottom > 0 || rect.bottom <= window.innerHeight);
}

您可能应该为您的ngrepeat的结束触发一个事件,如下所示:

然后您可以在指令中捕捉到确切的事件。 这是我见过的最接近没有太多杂乱的工作。 还要注意的是,如果在触发自定义ngrepeat finish事件的那一刻有可见性切换ng show,那么仍然可能会得到奇怪的值

function isOffscreen(el) {
    var rect = el.getBoundingClientRect();
    return (rect.bottom > 0 || rect.bottom <= window.innerHeight);
}