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 相关文章推荐
网上应用的一个不错common.js脚本
Aug 08 Javascript
不同浏览器对回车提交表单的处理办法
Feb 13 Javascript
js Array对象的扩展函数代码
Apr 24 Javascript
Javascript闭包实例详解
Nov 29 Javascript
JS实现页面载入时随机显示图片效果
Sep 07 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
Jun 12 jQuery
JS设置随机出现2个数字的实例代码
Jul 19 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
记录一次完整的react hooks实践
Mar 11 Javascript
vue设置导航栏、侧边栏为公共页面的例子
Nov 01 Javascript
OpenLayers3加载常用控件使用方法详解
Sep 25 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
我的论坛源代码(六)
2006/10/09 PHP
php 删除记录实现代码
2009/03/12 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
基于PHP文件操作的详解
2013/06/05 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
用Python实现一个简单的线程池
2015/04/07 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
Tensorflow累加的实现案例
2020/02/05 Python
what is the difference between ext2 and ext3
2013/11/03 面试题
生产部厂长助理职位说明书
2014/03/03 职场文书
公休请假条
2014/04/11 职场文书
2019秋季运动会口号
2019/06/25 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python