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的asp.net树实现代码
Nov 30 Javascript
jQuery代码优化 事件委托篇
Nov 01 Javascript
Json对象与Json字符串互转(4种转换方式)
Mar 27 Javascript
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
Dec 27 Javascript
js sort 二维数组排序的用法小结
Jan 24 Javascript
js判断浏览器是否支持html5
Aug 17 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
Nov 03 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 Javascript
Vue如何将页面导出成PDF文件
Aug 17 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 特殊字符处理函数
2008/09/05 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
js渐变显示渐变消失示例代码
2013/08/01 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
python获取本机mac地址和ip地址的方法
2015/04/29 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
Windows下python3.7安装教程
2018/07/31 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
生产经理的自我评价分享
2013/11/07 职场文书
季度思想汇报
2014/01/01 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
城管年度个人总结
2015/02/28 职场文书
个人党性锻炼总结
2015/03/05 职场文书
windows server2008 开启端口的实现方法
2022/06/25 Servers