无法弄清页面为什么会加载到底部?Angular UI-Router自动滚动问题
无法弄清页面为什么会加载到底部?Angular UI-Router自动滚动问题
对我来说,我无法解释为什么这个主页在底部加载。这是一个angular ui-router、angular、javascript还是CSS的问题?我已经困扰了两个小时,不知道为什么我的html页面在底部而不是顶部加载,这真的让我作为一个程序员的自尊心受到了打击 :/
这是主页的链接:[链接已删除]
更新 --
我解决了这个问题。问题出在Angular UI-Router上。请参见下面的答案了解简单的修复方法。
我使用Angular和Angular UI-Router,设置如下...
default.jade
doctype html
html(lang='en', xmlns='http://www.w3.org/1999/xhtml', xmlns:fb='https://www.facebook.com/2008/fbml', itemscope='itemscope', itemtype='http://schema.org/Product')
include ../includes/head
body(ng-controller="RootController")
block content
include ../includes/foot
index.jade
extends layouts/default block content section.container div(ui-view="header") div(ui-view="content") div(ui-view="footer")
Angular Config.js
window.app.config(function($stateProvider, $urlRouterProvider) { // 对于任何未匹配的URL,重定向到“/” $urlRouterProvider.otherwise("/"); // 现在设置状态 $stateProvider .state('home', { url: "/", views: { "header": { templateUrl: "views/header/home.html" }, "content": { templateUrl: "views/content/home.html" }, "footer": { templateUrl: "views/footer/footer.html" } }, resolve: { factory: setRoot } }) .state('signin', { url: "/signin", views: { "header": { templateUrl: "views/header/signin.html" }, "content": { templateUrl: "views/content/signin.html" }, "footer": { templateUrl: "views/footer/footer.html" } }, resolve: { factory: setRoot } })
在这个问题中,页面在底部加载的原因可能是由于自动滚动功能不起作用。以下是一些解决方法:
一种可能的解决方法是使用一个临时解决办法,因为自动滚动对我不起作用,所以我强行将视图滚动到顶部。希望这对你有帮助。
app.run(['$window', '$rootScope', '$location' ,'$cookieStore', '$state', 'CacheManager', '$timeout', function($window, $rootScope, $location, $cookieStore, $state,CacheManager, $timeout){ $rootScope.$on('$viewContentLoaded', function(){ var interval = setInterval(function(){ if (document.readyState == "complete") { window.scrollTo(0, 0); clearInterval(interval); } },200); }); }]);
这对我起作用。我还能简单地移除以下代码,它工作正常并消除了200毫秒的延迟。
$rootScope.$on('$viewContentLoaded', function(){ window.scrollTo(0, 0); });
更好的解决方法是使用$anchorScroll()而不是window.scrollTo。我现在使用锚点滚动,它可以工作。
$rootScope.$on("$viewContentLoaded", function(){ $anchorScroll(); });
"$rootScope.$on("$viewContentLoaded", function(){ $anchorScroll(); });" 对我无效。但这个解决办法有效:
$rootScope.$on('$viewContentLoaded', function(){ window.scrollTo(0, 0); });
简单又高效 🙂 谢谢提供解决方案。
最近Angular UI-Router更新了应用程序,使得默认情况下自动滚动到新加载的视图。这导致我的应用程序的页面在加载时滚动到了底部。要关闭这个功能,只需在ui-view中添加以下属性:
<div ui-view="header" autoscroll="true"></div>
。我遇到了OP描述的问题,这对我有效,但我必须在多个子兄弟节点的ui-view div中添加这个属性。自从这个帖子发布以来,ui-router已经改变了autoscroll的默认行为。现在的autoscroll="false"
设置在加载新视图时会保留滚动位置。但是autoscroll="true"
会将新视图加载到顶部。这个解决方案对我来说非常有效。但当我使用浏览器的返回按钮加载上一个页面时,它也会滚动到顶部,因为autoscroll='true'。有什么解决办法吗?嗨,由于某种原因,这个autoscroll对我不起作用。我有一个ui-view,它加载了一个嵌套的ui-view(3个视图:header、content和footer)。当我进入一个重新加载内容视图并滚动到一半的状态,然后重新加载浏览器,它会自动滚动回到那个确切位置。我尝试了一切,甚至使用了$uiViewScroll(element)来创建一个scrollTop指令。没有什么效果。这真的让我发疯。我只想始终从屏幕顶部开始,但似乎无法绕过这个autoscroll功能。有人有解决办法吗?不可思议。我只能对自己说:RTF。我在autoscroll中没有使用表达式。我使用了autoscroll="false"
而不是autoscroll=" 'false' "
。很容易忽视。也许在代码中有什么方式可以捕捉到这种情况?如果是布尔值,将其转换为表达式。对我来说,autoscroll="true"
和autoscroll="false"
都不能实现我所需要的。如果我希望应用程序每次加载时都在窗口的顶部(而不是视图的顶部),不管他们在上一个视图中滚动到哪里,该怎么办呢?