jQuery scrollTop()为所有元素返回0

时间:2014-03-04 13:36:34

标签: javascript jquery angularjs scroll angular-ui-router

在我的工作中,我们有一个我用AngularJS创建的单页网站 我们正在使用ui-router插件(版本0.2.0) 最近我注意到当从一个状态移动到另一个状态时,窗口不会滚动到顶部 我甚至试图在每次状态更改时使用jQuery的scrollTop()函数手动滚动到顶部(使用$stateChangeSuccess事件)。但它没有用。

所以我开始调查,我注意到scrollTop()为页面上的每个元素返回0。 不仅如此,当我将window.scrollY打印到控制台时,我得到0(无论我在页面上的哪个位置)。不仅在我的代码中,而且即使我只是在chrome dev工具控制台中编写它。

我用AngularJS和ui-router编写了几个应用程序,它只发生在这个特定的应用程序中。

我已经检查过我是否覆盖了scrollTop()函数甚至是window.scrollY字段,但是没有找到任何内容。

我已尝试将ui-viewautoscroll="true"autoscroll="false"一起使用,但它没有任何区别。

我也试过提供htmlbody元素height:100%,我也试过了。但没什么。

我真的不知道下一步该做什么。

我无法重现这个问题,但是如果您认为我应该在这里发布任何可能有任何帮助的代码,我会很乐意这样做。

谢谢!

修改

我在控制台上运行此功能:

var l = $('*').length;
for(var i = 0; i < l; i++) {
    var elem = $('*:eq(' + i + ')');
    if(elem.scrollTop() > 0) {
        console.log(elem, elem.scrollTop());
    }
}

该功能只打印出一个带有顶部滚动的元素 元素是一个包装div,它包含整个内容和主视图(我的应用程序中有嵌套视图) 如果我在这个元素上使用scrollTop(0),我得到了我想要的东西,但它只处理症状,而不是真正的问题。

3 个答案:

答案 0 :(得分:4)

正如@Hans评论的那样,实际上并没有问题。 我有一个包裹元素,位于absolute,位于:

top:0;
bottom:0;
left:0;
right:0;
overflow:auto

所以窗口的scrollTop始终为0,滚动条实际上​​属于包装元素。

由于我无法摆脱包装元素的定位,我使用了ui-router的$stateChangeSuccess事件,并手动将包装元素滚动到顶部。

答案 1 :(得分:2)

在控制台中,尝试

console.log(frames)
console.log(frames.top.scrollY)

如果window.scrollY显示为0,则参考帧不能是窗口。你在页面上有任何iframe吗? console.log框架将显示页面上的框架列表 希望有所帮助。

答案 2 :(得分:1)

我的代码也发生了这个问题,我发现了一个正文{overflow:hidden;}是原因,我删除了“overflow:hidden;”一切都很好。