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 相关文章推荐
JS 判断undefined的实现代码
Nov 26 Javascript
Jquery AutoComplete自动完成 的使用方法实例
Mar 19 Javascript
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
JS实现一键回顶功能示例代码
Oct 28 Javascript
javascript生成随机大小写字母的方法
Feb 20 Javascript
详解基于Bootstrap扁平化的后台框架Ace
Nov 27 Javascript
详解堆的javascript实现方法
Nov 29 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
Jul 24 Javascript
bootstrap Table服务端处理分页(后台是.net)
Oct 19 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
Jul 21 Javascript
JavaScript的一些小技巧分享
Jan 06 Javascript
使用Ajax实现无刷新上传文件
Apr 12 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递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
js获取当前select 元素值的代码
2010/04/19 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
nodejs基础知识
2017/02/03 NodeJs
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
Python with标签使用方法解析
2020/01/17 Python
如何使用python代码操作git代码
2020/02/29 Python
Python函数基本使用原理详解
2020/03/19 Python
Python 实现集合Set的示例
2020/12/21 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
餐厅经理岗位职责范本
2014/02/17 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
爱国口号
2014/06/19 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
公司新员工欢迎词
2015/09/30 职场文书
vscode内网访问服务器的方法
2022/06/28 Servers
python中使用redis用法详解
2022/12/24 Redis