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 相关文章推荐
Html中JS脚本执行顺序简单举例说明
Jun 19 Javascript
JavaScript中URL编码函数代码
Jan 11 Javascript
Table冻结表头示例代码
Aug 20 Javascript
教你用jquery实现iframe自适应高度
Jun 11 Javascript
Javascript 数组排序详解
Oct 22 Javascript
jQuery中toggle()函数的使用实例
Apr 17 Javascript
Jquery动态添加输入框的方法
May 29 Javascript
微信小程序 页面跳转传参详解
Oct 28 Javascript
Angular2 Service实现简单音乐播放器服务
Feb 24 Javascript
js禁止浏览器页面后退功能的实例(推荐)
Sep 01 Javascript
JavaScript中使用import 和require打包后实现原理分析
Mar 07 Javascript
layer弹出层自定义提交取消按钮的例子
Sep 10 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中GET变量的使用
2006/10/09 PHP
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
PHP发送短信代码分享
2015/08/11 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
Python 查看文件的编码格式方法
2017/12/21 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
悬挂训练绳:TRX
2017/12/14 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
strlen的几种不同实现方法
2013/05/31 面试题
工厂门卫岗位职责
2013/11/25 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
Win11 BitLocker 驱动器加密
2022/04/19 数码科技