AngularJS使用ng-Cloak阻止初始化闪烁问题的方法


Posted in Javascript onNovember 03, 2016

本文实例讲述了AngularJS使用ng-Cloak阻止初始化闪烁问题的方法。分享给大家供大家参考,具体如下:

在做angular的SPA开发时,我们经常会遇见在如Chrome这类能够快速解析的浏览器上出现表达式({% raw %} {{ express }} {% endraw %} ),或者是模块(div)的闪烁。对于这个问题由于JavaScript去操作DOM,都会等待DOM加载完成(DOM ready)。对于angular会在DOM ready完会才回去解析html view Template,所以对于Chrome这类快速的浏览器你会看见有闪烁的情况出现。而对于IE7,8这类解析稍慢的浏览器大部分情况下是不会出现这个问题的。

angular中为我们提供了ng-cloak来实现防止闪烁的方案,我们只需要在需要的地方加上ng-cloak。同时对于bing文字({% raw %}{{ express }} {% endraw %})我们也可以改为ng-bind来实现避免。

<div id="template1" ng-cloak>{{ 'hello' }}</div>
<div id="template2" ng-cloak class="ng-cloak">{% raw %} {{ 'hello IE7' }} {% endraw %} </div>
<div id="template2" ng-bing="'hello IE7'"></div>

angular将ng-cloak实现为一个directive,并会在初始化的时候在DOM的heade增加一行css代码,如下:

@charset "UTF-8";[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\:form{display:block;}.ng-animate-start{clip:rect(0,auto,auto,0);-ms-zoom:1.0001;}.ng-animate-active{clip:rect(-1px,auto,auto,0);-ms-zoom:1;}

从上面我们可以看见angular将带有ng-clock的的元素设置为display:none,隐藏掉,在等到angular解析到带有ng-clock的节点时候,会把attribute和class同时remove掉,这样就可以实现防止节点的闪烁。

var ngCloakDirective = ngDirective({
   compile: function(element, attr) {
    attr.$set('ngCloak', undefined);
    element.removeClass('ng-cloak');
   }
});

在angular-bootstrap.js中会看见这样的代码去增加前面所说的css:

document.write('<link rel="stylesheet" type="text/css" href="' + serverPath + '../css/angular.css"/>');

好像闪烁的问题好像已经能够被我解决了,恩是否是这样的,理论也改如此,但是现实是残酷的,我们的感性认识经常会被现实一记重重的耳光,我们才能很更深入全面的思考,如果浏览器的速度比angular在head中加入css的速度还快呢?我在给公司的一个项目组解决这个闪烁的问题的时候就遇见了这个问题。怎么办呢?那我们只能使出我们必杀技,自己把css加入我们的css文件引入heade,启动加载,ok这样就可以完美解决了。(如果你也遇见了加了ng-cloak还不起作用的话,那么试试直接引入css文件吧)

到这里关于ng-cloak的原理和解决方案已经完成。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
javascript时间函数大全
Jun 30 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
Oct 20 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
Sep 20 Javascript
vue.js从安装到搭建过程详解
Mar 17 Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 Javascript
vue中使用sessionStorage记住密码功能
Jul 24 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
vue实现滑动切换效果(仅在手机模式下可用)
Jun 29 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
Nov 06 Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
Oct 28 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 #Javascript
vue自定义指令实现v-tap插件
Nov 03 #Javascript
angular ngClick阻止冒泡使用默认行为的方法
Nov 03 #Javascript
vue.js指令v-for使用及索引获取
Nov 03 #Javascript
vue.js初学入门教程(1)
Nov 03 #Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
Nov 03 #Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
Nov 03 #Javascript
You might like
php生成文件
2007/01/15 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
javascript动态加载二
2012/08/22 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
python中xrange和range的区别
2014/05/13 Python
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
人力资源管理专业学生自我评价
2013/11/20 职场文书
优秀学生自我鉴定范例
2013/12/18 职场文书
毕业生求职自荐信怎么写
2014/01/08 职场文书
集体婚礼证婚词
2014/01/13 职场文书
创业计划书之餐饮
2019/09/02 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
Java 多线程协作作业之信号同步
2022/05/11 Java/Android