javascript - 加载所有异步数据和图像后滚动到 anchor

标签 javascript html angularjs scroll

我的应用程序有一个问题。应用程序聚合了一些事件列表 - 每个事件由几个部分组成(描述、演讲者、位置等)。在主页上我有事件列表(图像,+一些链接)。当我单击图像时 - 应用程序正在切换到事件详细信息(它是不同的路线、 Controller 和 View )。现在一切都好了。但我希望当用户单击事件列表主页上名为“位置”的链接时,应用程序不仅应重定向到事件详细信息 View ,而且应向下滚动到名为位置的部分。

我们使用:

$document.scrollTo(document.getElementById('my_id'), 70);

嗯 - 它有效,但事件详细信息 Controller 中的一些数据以异步方式从 firebase 加载 - 所以 id 有效,但在加载数据(和图像)后 - 滚动位置保持不变,但页面内容向下移动(因为数据已加载)并且所有内容都以错误的滚动位置结束。

所以我们用以下内容包装它:

$timeout(function() {
           $document.scrollTo(document.getElementById('my_id'), 70);
}, 1000);

它很有帮助 - 实际上滚动机制会等待 1 秒,并且在加载所有数据和图像后 - 应用程序向下滚动并且滚动处于良好位置。

除此之外,我们认为这是相当糟糕的解决方案 - 有时甚至会失败 - 特别是当网络速度较慢并且数据和图像加载时间超过 1 秒时。当然,我们可以将超时设置为 2 秒 - 但问题仍然相同。

在加载所有异步数据以及加载和渲染所有图像后,是否有机会以某种方式绑定(bind)(或广播然后绑定(bind))到事件?我尝试了在互联网上找到的每个解决方案(anchorScroll、jquery img load、在获取所有 firebase 元素后广播事件以及每个事件后 countinuus 滚动),但没有运气。

最佳答案

一种可能的解决方案是创建一个属性指令 监视范围上的已加载属性并将内容滚动到 具有该指令的元素。当您知道时,您可以切换 $scope.loaded 一切都已加载。您可以在指令的 link 函数中访问元素和范围。所以你可以在里面执行 $document.scrollTo(element, 70);

angular.module('app').directive('scrollTo', function($document) {
  return {
    restrict: 'A',
    link: function (scope, element, attrs) {
      scope.$watch('loaded', function() {
        $document.scrollTo(element, 70);
      });
    }
  };
});

您还可以在路由中使用 resolve 属性来等待所有内容加载完毕,然后再渲染此页面。在这种情况下,您可以确保滚动到正确的位置

关于javascript - 加载所有异步数据和图像后滚动到 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35969831/

相关文章:

JavaScript 定界符?转义换行符 : JSLint Bad Escapement?

javascript - 整数值在输入文本字段中是否表现为字符串?

javascript - Jade/JavaScript - 访问传递给 Jade 的数据

javascript - 如何使用 bootstrap、javascript、jquery 制作内联日历

javascript - 如何在 Angular 或 Javascript 中获取多个对象中的数组结果?

javascript - 如何用 Protractor 计算不可见的项目

javascript - 在向 jQuery UI 对话框添加按钮时,如何防止他人更改或避免我的 JavaScript 逻辑?

java - 是否可以使用 "$1"作为另一个方法的参数并将返回的字符串放在 .replaceAll 中的位置?

javascript - 使用JQuery点击类 ".x"的div时触发事件

javascript - Websocket Javascript 客户端 onmessage 不会触发