情景

当我点击了button, div才能显示。并且我想知道这个div的高度。

问题

当我点击这个button以后这个。chrome就然告诉我这个div高度是0.这不是睁着眼睛说瞎话吗?怎么能如此欺骗我这个纯真少女的感情!!!

分析

感谢我的同事在我身边给我给我指导!
正式点 我要开始说说问题的解决了!!!
总结 其实是这样的当我点击了这个button以后 Angularjs还没有渲染完dom,这个时候就直接取了div的值,当然是0.

解决这个问题先要了解Event loop!!!
什么是event loop?

我们知道js再一出生的时候就想将它运用于网页脚本上面,所有不能太复杂。就用单线程吧!
单线程就意味着执行完一个任务再执行另外一个任务, 会造成很多浪费。
于是我们将任务分成两种同步任务和异步任务。

  • 同步任务就是主线中运行的,也叫执行栈。
  • 主线任务外还存在一个任务列表,异步任务有了结果,存在任务列表。
  • 主线任务完成就会读取任务列表,执行相应的异步任务。等待结果解释,再去执行主线任务。

    任务队列中完成一个I/O任务,就会添加一个事件,表示相关任务可以进入执行栈了。主线程读取"任务队列",就是读取里面有哪些事件。
    回调函数会放在主线中调起来,当异步任务执行完后,就会执行对应的回调函数。

主线从任务队列中读取事件,这个机制就叫event loop。

好吧 简单点来说就是click事件已经放入任务队列中了,我们只需要再click事件放入事件队列后,再放入取高度的事件到事件队列中就可以依次实行。

而setTimeout()就可以实现将事件插入了"任务队列"中。

解决

在angularjs中可以使用$timeout

注意 $timeout 第三个参数,是否调用 apply 方法, 这是 AngularJS 性能的一个优化点。

因此 此处用法是 $timeout( function (){ $(div).height() } , 0 , false);

angular与event loop 执行关系

参考

关于angularjs dom渲染结束再执行的问题的更多相关文章

  1. Javascript:再论Javascript的单线程机制 之 DOM渲染时机

    Javascript:再论Javascript的单线程机制 之 DOM渲染时机 背景 Javascript是单线程事件驱动的,所有能看到的Javascript代码都是在一个线程执行,定时器回调和AJA ...

  2. angularjs中如何在异步请求执行完以后再执行其他函数?

    angularjs中如何在异步请求执行完以后再执行其他函数? 之前脑袋回路就是从上到下的执行js,直到有一次我的页面上已经显示了空才走到angularjs里的$http的成功回调函数里,然后才开始正视 ...

  3. Vue.nextTick DOM 更新循环结束之后执行延迟回调

    在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 简单来说,Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统 ...

  4. C# 多线程join的用法,等待多个子线程结束后再执行主线程

    等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ...

  5. angularjs如何在视图渲染结束之后,或者render之后执行指令中的link方法呢?

    angularjs如何在视图渲染结束之后,或者render之后执行指令中的link方法 关键字: $timeout app.directive("myDirective",func ...

  6. Angularjs判断页面是否已经渲染结束(动态给标签长度)

    相信大家都会碰到这样的问题.页面循环li.但是因为个数不知道.没有办法给li设置固定宽度.那么这时就需要动态计算数据长度并动态改变li的宽度 <!--周边信息--> <div cla ...

  7. 多个线程运行结束之后主线程再执行CountDownLatch

    多个线程运行结束之后主线程再执行CountDownLatch 学习了:http://blog.csdn.net/lvyuanj/article/details/50737123  这个要膜拜一下! h ...

  8. angular先加载页面再执行事件,使用echarts渲染页面

    剧情重现: 在一个页面中有多个小模块,这几个模块是可以拖动调顺序的,并且其中有两个模块使用了echarts渲染, 调整顺序angular插件有成熟的解决方案angular-sortable,https ...

  9. angular中关于自定义指令——repeat渲染完成后执行动作

    业务中有时需要在异步获取数据并用ng-repeat遍历渲染完页面后执行某个操作,angular本身并没有提供监听ng-repeat渲染完成的指令,所以需要自己动手写.有经验的同学都应该知道,在ng-r ...

随机推荐

  1. 关于each()、find()、filter()遍历节点的操作方法

    关于each().find().filter()遍历节点的操作方法 each语法: each(fn)  ; 返回值:jQuery fn:代表对于每个匹配元素所要执行的函数 each()方法共有三种形式 ...

  2. matlab7 + sqlitejdbc-v056.jar出现错误

    conn=database('data.db','','','org.sqlite.JDBC','jdbc:sqlite:C:/MATLAB7/work/del_man_voice_from_wave ...

  3. fork+exec 与system,popen区别

    1.fork + exec fork用来创建一个子进程.一个程序一调用fork函数,系统就为一个新的进程准备了前述三个段,首先,系统让新的进程与旧的进程使用同一个代码段,因为它们的程序还是相同的,对于 ...

  4. kubernetes 搭建集群外部ip服务

    nginx-pod.yaml apiVersion: v1 kind: Pod metadata: name: webapp labels: app: webapp spec: containers: ...

  5. SpringMvc+Spring+Mybatis+Maven整合

    一.建立数据库表,使用generator自动生成相关代码: /* SQLyog Ultimate v11.24 (32 bit) MySQL - 5.1.62-community : Database ...

  6. pymongo: MongoClient opened before fork错误排解

    使用pymongo配合flask和gunicorn使用的时候触发以下错误信息: [2017-09-19 15:20: ] [25780] [CRITICAL] WORKER TIMEOUT (pid: ...

  7. Jquery实现逐屏加载图片

    引用jquery.scrollLoading.js $(document).ready(function () { //实现图片慢慢浮现出来的效果 $("img").load(fu ...

  8. 洛谷 P1064 金明的预算方案【DP/01背包-方案数】

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...

  9. 01Trie树【p2420】 让我们异或吧

    Description 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生) ...

  10. tyvj——P1001 第K极值

    P1001 第K极值 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 成成第一次模拟赛 第一道 描述 给定一个长度为N(0<n<=10000)的序 ...