如何在 AngularJS 中检测 HTML 渲染何时完成

2023-12-09

我对这个课题进行了广泛的研究,但无论我做什么,我发现实现这个目标都极其困难。

我想在 AngularJS Web 应用程序中完全呈现所有元素时执行代码。我想我找到了建议使用路由器和视图的解决方案,但我无法在我的情况下使用它,因为它似乎需要某些配置。

当你有ng-repeat和很多嵌套的directives将根据各种条件生成 HTML/内容ng-if,我注意到即使在文档就绪事件被触发或视图内容已加载后,HTML 渲染仍会继续,即$viewContentLoaded事件被触发。

我最接近的想法是使用$watch超过给定元素的子元素的长度directive。每次$watch执行完毕,计数器递增renderCount。然后,在另一个计时器事件中,检查计数器是否renderCount过去3-5秒没有变化,那么我们可以假设渲染已经完成。

监视子级并检查是否不再进行渲染的代码可能如下所示:

app.directive('whenRenderingDone',  function($interval, $parse){
    return {
        link: function (scope, el, attrs) {
            var renderingCount = 0;
            function watchForChildren() {
                scope.$watch(function(){
                    return $(':input', el).length;
                }, function(newVal, oldVal){
                    if (newVal) {
                        renderingCount++;
                    }
                })
            }
            watchForChildren();
            //Check counter every 3 seconds, if no change since last time, this means rendering is done.
            var checkRenderingDone = $interval(function(){
                var lastCount = lastCount || -1;
                if (lastCount === renderingCount) {
                    var func = $parse(attrs.whenRenderingDone);
                    $interval.cancel(checkRenderingDone);
                    func(scope);
                }
                lastCount = renderingCount || -1;
            }, 3000);
        }
    }
});

我会尝试实施上述方法,如果您有反馈,请告诉我。

Tarek


我开发了以下指令,该指令在 Chrome 和 IE11 下运行良好:

app.directive('whenRenderingDone',  function($timeout, $parse){
    return {
        link: function (scope, el, attrs) {
            var lastCount;
            var lastTimer = 5000; // Initial timeout
            //Check counter every few seconds, if no change since last time, this means rendering is done.
            var checkRenderingDone = function (){
                var mainPromiseResolved = scope.mainPromiseResolved;
                lastCount = lastCount || -1;
                if (lastCount === el.find('*').length && mainPromiseResolved) {
                    console.log('Rendering done, lastCount = %i', lastCount);
                    var func = $parse(attrs.whenRenderingDone);
                    func(scope);
                } else {
                    lastCount = el.find('*').length;
                    console.log('mainPromiseResolved = %s, lastCount %i', mainPromiseResolved, lastCount)
                    console.log('Rendering not yet done. Check again after %i seconds.', lastTimer/1000.00);
                    stopCheckRendering = $timeout(checkRenderingDone, lastTimer); 
                    lastTimer = lastTimer - 1000;
                    if (lastTimer <= 0) {
                        lastTimer = 1000;
                    }
                    return stopCheckRendering;
                }
            }
            var stopCheckRendering;
            stopCheckRendering = checkRenderingDone();
            el.on('$destroy', function() {
                if (stopCheckRendering) {
                    $timeout.cancel(stopCheckRendering);
                }
              });
        }
    }
});

希望本文对您有所帮助,如果您有任何需要改进的意见,请告诉我。See this让您了解它是如何工作的。

Tarek

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 AngularJS 中检测 HTML 渲染何时完成 的相关文章

  • 显示班级图片 10 秒

    我有下面给出的代码显示9 boxes 其值如下digital time 还有一个班级box002显示digits相当于随机选择的九个盒子的值 box002 can be dragged to digital time starting wi
  • 使用 JavaScript onclick 添加表格行

    我正在尝试使用 javascript 添加下面找到的完全相同的元素 我已经尝试了这里找到的所有解决方案 我什至尝试用php echo但没有运气 无需更改任何输入名称或类似内容 只需单击该按钮即可向表中添加另一行 仅此而已 这是该元素 tr
  • 为什么 `input type="date"` 的行为发生了变化?

    日期输入 例如
  • 使用滤镜将css3灰色图像转为蓝色?

    我正在尝试将灰色图像变为更蓝色的色调 真的不知道如何为此设置滤镜或是否可能 该图像只有一种颜色 cacaca 其余部分透明 我正在尝试使用相同的图像进行一些叠加 以便它仅突出显示那些彩色部分而不是透明区域 一直在尝试其中的一些 但没有取得多
  • 由于 MIME 类型不受支持,拒绝应用样式

    我不断收到一条错误消息 指出 MIME 类型 text html 不可执行或不是受支持的样式表 MIME 类型 并且启用了严格的 MIME 检查 我的链接代码是
  • html 和 body 元素的高度

    我一直在互联网上查找 min height 和 height 属性如何在 body 和 html 元素上工作 我在很多地方都看到过下面的代码 html height 100 body min height 100 上面的内容可以与其他一些
  • 将样式添加到 mat-autocomplete 的 mat-option

    我有这个 HTML代码在这里 https stackblitz com edit angular mat autocomplete with selected value vx1uqg file src 2Fapp 2Fautocomple
  • 使用 iframe 显示静态文本内容

    我有一个非常简单的要求 我有一个 div 我在其中显示一些文本内容的标签 我想在一个中显示相同的文本内容 我想要实现的目标已写在下面 有人可以帮忙吗 b div This is a content which I want to displ
  • 有没有办法禁用所选 DOM 元素的 Angular 双大括号表示法?

    在我们的网站上 我们显示用户生成的内容 博客文章等 它由 Symfony 应用程序呈现 前端目前正在以 Angular 应用程序的形式重写 现在我们注意到 当用户的博客文章包含双花括号符号时 Angular 会处理它 这是不希望的 Angu
  • 当 URL 包含片段时,iframe 会导致父元素在 Google Chrome 上向上滚动

    在 Google Chrome 37 0 2062 122 OSX Windows 上 具有包含片段的 URL 的 iframe 会导致父元素向上滚动 它只发生在 Chrome 中 在 Safari 和 Firefox 中测试 这是显示问题
  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • angularjs:timeout 在 $http POST 请求中不起作用

    我的代码中有以下代码片段 它为请求设置了以毫秒为单位的超时 但即使满足超时 它也不会取消 var httpURL method URLobj method url urlString data data withCredentials tr
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • 避免响应式页面的重复内容

    我目前正在做一个涉及响应式设计的项目 整个布局应该使用HTML和CSS来实现 我知道可以使用 java 脚本将内容从一个列布局移动到另一列布局 而无需复制内容 但是使用 HTML 和 CSS 是否可以实现相同的效果 以下面的例子为例 它会在
  • 我可以使用 jQuery 打开下拉列表吗

    对于 HTML 中的下拉列表
  • 如何在 AngularJS 循环内使用标签

    所以我在里面ng repeat像这样 li li
  • FireFox 中的“contenteditable = true”高度问题

    当有空的时候div with contenteditable true CSS contenteditable true border 1px dashed dedede padding 3px HTML div div 在 IE 和 Ch

随机推荐

  • 如何让 NHibernate 只生成 SQL 而不执行它?

    我知道如何在运行时使用以下命令将 SQL 记录到 log4net NLog trace 窗口show sql配置选项 我正在寻找的是一种给予Query
  • Jquery浏览器的停止按钮事件

    有没有办法检测用户何时单击任何浏览器上的停止按钮 我想在用户上传文件时决定单击停止按钮时停止脚本运行 这样我就可以触发脚本刷新页面 不幸的是 浏览器的停止按钮不会影响 AJAX 请求 如果你想取消 AJAX 请求 可以像下面这样中止它 va
  • 如何在ionic2中传递数据

    我通过http获取数据 我想将数据传递到 PlacesListPage 我的数据中有 id name category 我想在 PlacesListPage 中使用这些内容 如下所示 xxx id xxx name 请帮助我 xxx 例如
  • 如何衡量承诺的执行时间?

    我正在尝试编写一个函数来测量另一个函数的执行时间 export class Profiler public measureSyncFunc fn gt any Promise
  • 从命令行使用 nntool [MATLAB]

    我有这个代码 in 5 columns of data points out 1 column of data points net newfit in out 5 net train net in out 现在我想要 访问误差变量生成的
  • 在matlab中加载stl文件并转换为3D数组

    我有一个 stl 文件 我已使用 stlread 函数将其加载到 Matlab 中 此时我有一组面和顶点 如何将这些面和顶点转换为 512x512x100 数组等 3D 二进制数组以获得二进制 3D 体积 啊你真幸运 我最近正在处理 STL
  • C++ 中运算符 << 的重写

    我正在为我的学校做一个 C 项目 我有两个班级 雇员和老师 Teacher 源自 Employe 并优先于其职能 我们重写运算符 lt lt 打印员工或教师的一些信息 每个班级都有一个const int attribute LevelAcc
  • 密钥“PRIMARY”重复输入“0”

    我不明白为什么在尝试填充此表时会收到此错误 目前表中没有任何内容 所以我不明白为什么会有重复的 这是我正在使用的代码 INSERT INTO Suppliers supp id company name town phone Values
  • 调试rails 3.1.1 应用程序

    我尝试向使用 ruby 1 9 2 的 Rails 3 1 1 应用程序添加调试器 我已将以下内容添加到我的 gemfile 中 gem ruby debug19 require gt ruby debug 我收到以下错误 rvm gems
  • 使用 PHP 发送批量电子邮件

    当新用户加入时 我必须向网站中的所有用户发送邮件 我的问题是脚本在发送大约 400 封邮件后停止执行 我已将 set time limit 设置为 0 并且我在发送 10 封邮件后给予 sleep 2 此问题背后的原因可能是什么 此问题的任
  • 列表列表到词典列表

    如何将列表列表转换为字典列表 更具体地说 我该如何处理 a1 b1 c1 d1 e1 f1 g1 h1 i1 a2 b2 c2 d2 e2 f2 g2 h2 i2 a3 b3 c3 d3 e3 f3 g3 h3 i3 a4 b4 c4 d4
  • JBoss 7.1 Weld 在耳边的罐子里发现了 Managed Bean,但战争并没有

    jboss as 7 1 1 动态 Web 模块 3 0 JSF 2 0 Mojarra Eclipse Indigo sr2 我有一个 EAR Ynale ear 其中包含一个 YnaleImpl jar 和一个 Ynale war Yn
  • 我如何操作一个非常大的列表

    我有超过 10000 个文件 我首先将目录设置为文件所在的文件夹 然后我用以下命令链接到所有文件 txt像这样的格式 filenames lt list files path to the file pattern txt full nam
  • DENSE_RANK() 无重复

    我的数据如下所示 col1 col2 denserank whatiwant 1 1 1 1 2 1 1 1 3 2 2 2 4 2 2 2 5 1 1 3 6 2 2 4 7 2 2
  • 如果通过 Xcode 安装应用程序,它会在我的 iOS 设备上继续运行多长时间?

    刚刚开始使用 iOS 并构建了一个非常简单的应用程序 我在 iPad 上使用和测试了该应用程序 如果我在 Xcode 中单击 停止 应用程序仍然可以在我的 iPad 上启动和使用 而无需 Xcode 调试 考虑到我没有 Apple 开发者帐
  • Android 平台上的“Fatal signal 7 (SIGBUS) at 0x5937abd0 (code=2)”到底是什么意思?

    致命信号 7 SIGBUS at 0x5937abd0 code 2 的确切含义是什么 回溯和堆栈信息如下 12 23 17 43 37 904 F libc 16421 Fatal signal 7 SIGBUS at 0x5937abd
  • 自定义 WordPress 3.5.2 插件“您没有足够的权限访问此页面。”

    我一直在尝试集成一个名为的自定义 WordPress 插件custom rss通过以下方式进入 WordPresshttp net tutsplus com tutorials wordpress creating a custom wor
  • 删除android中的特定联系人

    在我的应用程序中 我需要删除特定的CONTACT从电话通讯录中 但我只删除了特定号码 而不是整个联系人 所以请帮助我 提前致谢 要删除所有联系人 请使用以下代码 ContentResolver cr getContentResolver C
  • 升级后,@MapsId 在保存现有实体时抛出错误,但在其他方面工作正常

    我正在努力升级Spring Boot 1 5 21 项目 Java 8u221 to Spring Boot 2 1 9 Java 11 0 2 开放 在这两种情况下 我们都使用带有 spring boot 启动器和依赖解析器的 gradl
  • 如何在 AngularJS 中检测 HTML 渲染何时完成

    我对这个课题进行了广泛的研究 但无论我做什么 我发现实现这个目标都极其困难 我想在 AngularJS Web 应用程序中完全呈现所有元素时执行代码 我想我找到了建议使用路由器和视图的解决方案 但我无法在我的情况下使用它 因为它似乎需要某些