angular-ngSanitize模块-$sanitize服务详解


Posted in Javascript onJune 13, 2017

本篇主要讲解angular中的$sanitize这个服务.此服务依赖于ngSanitize模块.

要学习这个服务,先要了解另一个指令: ng-bing-html.

顾名思义,ng-bind-html和ng-bind的区别就是,ng-bind把值作为字符串,和元素的内容进行绑定,但是ng-bind-html把值作为html,和元素的html进行绑定.相当于jq里面的.text()和.html().

但是,出于安全考虑,如果我们直接使用ng-bind-html是会报错的,ng-bind-html后面的内容必须经过一定的处理.

处理的方式有两种,一种是使用$sce服务,另一种就是使用$sanitize服务.$sce服务怎么用,在以后的文章中会独立讲解,这篇主要讲解$sanitize服务.

$sanitize会根绝一个白名单来净化html标签.这样,不安全的内容就不会被返回. 白名单是根据$compileProvider的aHrefSanitizationWhitelist和imgSrcSanitizationWhitelist函数得到的.

看一个栗子:

html:

<!DOCTYPE html>
<html ng-app="myApp">
<head>
 <title></title>
 <meta charset="utf-8">
 <script src="../angular-1.3.2.js"></script>
 <script src="angular-sanitize.min.js"></script>
 <script src="script.js"></script>
 <link type="text/css" href="../bootstrap.css" rel="external nofollow" rel="stylesheet" />
</head>
<body>
<div class="container">
 <table class="table table-bordered" ng-controller="ctrl">
  <caption>通过ngSanitize模块的$sanitize服务解析html</caption>
  <thead>
  <tr>
   <th>使用的指令</th>
   <th>格式化方法</th>
   <th>指令的写法</th>
   <th>解析结果</th>
  </tr>
  </thead>
  <tbody>
  <tr>
   <td>ng-bind-html</td>
   <td>使用内置的$sanitize <br/>(不需要出现在js里,只要模型添加了ngSanitize模块, <br/>然后使用ng-bind-html,它的值就自动通过$sanitize编译)</td>
   <td><pre><div ng-bind-html="myHtml"><br></div></pre></td>
   <td><div ng-bind-html="myHtml"></div></td>
  </tr>
  <tr>
   <td>ng-bind-html</td>
   <td>使用$sce的trustAsHtml方法编译<br/>(以后会细讲$sce服务,这里不是重点)</td>
   <td><pre><div ng-bind-html="trustHtml"><br></div></pre></td>
   <td><div ng-bind-html="trustHtml"></div></td>
  </tr>
  <tr>
   <td>ng-bind</td>
   <td>不编译</td>
   <td><pre><div ng-bind="myHtml"><br></div></pre></td>
   <td><div ng-bind="myHtml"></div></td>
  </tr>
  </tbody>
 </table>
 <a class="btn btn-default" href="http://plnkr.co/edit/3FBasliZTRjKs3jwTpoR?p=preview" rel="external nofollow" role="button">plunker</a>
</div>
</body>
</html>

js:

var app =angular.module('myApp',['ngSanitize']);
app.controller('ctrl',function($scope,$sce){
  $scope.myHtml = '<p style="color:blue">an html\n' +
  '<em onclick="this.textContent=\'code_bunny\'">click here</em>\n' +
  'snippet</p>';
  $scope.trustHtml = $sce.trustAsHtml($scope.myHtml)
});

结果:

angular-ngSanitize模块-$sanitize服务详解

下面来具体说明一下这个栗子:

表格第一行: myHtml是一段字符串,但是它的内容是一段html,使用ng-bind-html可以把它作为元素的.html()绑定给元素.在这里我们给模块添加依赖 'ngSanitize' ,(需要链入angular-sanitize.min.js).然后使用ng-bind-html,$sanitize会自动对myHtml进行净化.

所以我们看到结果,myHtml是被作为html填充到div里面的,但是不再是原来的myHtml,而是这样的:

angular-ngSanitize模块-$sanitize服务详解

可以看到,$sanitize会把标签的属性都移除,以及绑定在元素上的事件.仅保留了标签和内容.

*记住,$sanitize指令本身不会出现在js代码里.直接使用ng-bind-html就行了.但如果这里不给模块添加依赖ngSanitize,是会报错的.

表格第二行: trustHtml 是myHtml通过$sce.trustAsHtml() 处理以后的返回值.所以它不再经过$sanitize服务的净化.直接作为元素的.html()绑定给元素,所以我们看到myHtml被完整的填充到了div里,保留了所有的属性和事件,这一行的内容不依赖于ngSanitize模块,$sce服务是内置的.

表格第三行: 不使用ng-bind-html指令.当使用ng-bind指令时,绑定的值就作为字符串填充到元素里,这个没什么好讲的.

完整代码: https://github.com/OOP-Code-Bunny/angular/tree/master/ngSanitize

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的合并table相同单元格的插件(精简版)
Apr 05 Javascript
在javascript中对于DOM的加强
Apr 11 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
Oct 20 Javascript
使用js判断控件是否获得焦点
Jan 03 Javascript
js使用栈来实现10进制转8进制与取除数及余数
Jun 11 Javascript
使用node.js半年来总结的 10 条经验
Aug 18 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
Feb 28 Javascript
简单谈谈关于 npm 5.0 的新坑
Jun 08 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
Sep 07 Javascript
微信小程序实现省市区三级地址选择
Jun 21 Javascript
vue2 拖动排序 vuedraggable组件的实现
Aug 08 Javascript
微信小程序获取地理位置及经纬度授权代码实例
Sep 18 Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 #Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
Jun 13 #jQuery
Javascript实现的StopWatch功能示例
Jun 13 #Javascript
原生JS实现图片懒加载(lazyload)实例
Jun 13 #Javascript
angular bootstrap timepicker TypeError提示怎么办
Jun 13 #Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
Jun 13 #Javascript
javascript实现非常简单的小数取整功能示例
Jun 13 #Javascript
You might like
PHP语法速查表
2006/12/06 PHP
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
php实现分页工具类分享
2014/01/09 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
如何使用Python 打印各种三角形
2019/06/28 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
Pytorch to(device)用法
2020/01/08 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
病假证明模板
2015/06/19 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
利用python做数据拟合详情
2021/11/17 Python