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 (十) jQueryUI常用功能实战
Feb 23 Javascript
Jquery 获取checkbox的checked问题
Nov 16 Javascript
使用javascipt---实现二分查找法
Apr 10 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
Nov 28 Javascript
判断浏览器的内核及版本号方法汇总
Jan 05 Javascript
创建你的第一个AngularJS应用的方法
Jun 16 Javascript
angularjs 源码解析之injector
Aug 22 Javascript
jQuery中的siblings()是什么意思(推荐)
Dec 29 Javascript
jQuery EasyUI之验证框validatebox实例详解
Apr 10 jQuery
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
Mar 01 Javascript
JavaScript面试技巧之数组的一些不low操作
Mar 22 Javascript
jQuery实现图片下载代码
Jul 18 jQuery
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基础之运算符的使用方法
2013/04/28 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
JS之小练习代码
2008/10/12 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
JS防止用户多次提交的简单代码
2013/08/01 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
Python常用知识点汇总
2016/05/08 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
四种会话跟踪技术
2015/05/20 面试题
护士求职推荐信范文
2013/11/23 职场文书
风险评估实施方案
2014/03/09 职场文书
群众路线党课主持词
2014/04/01 职场文书
运动会入场口号
2014/06/07 职场文书
高中学校对照检查材料
2014/08/31 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
高二语文教学反思
2016/02/16 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
导游词之潮音寺
2019/09/26 职场文书