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 相关文章推荐
javascript 写类方式之三
Jul 05 Javascript
jQuery插件实现静态HTML验证码校验
Nov 06 Javascript
每天一篇javascript学习小结(基础知识)
Nov 10 Javascript
分享使用AngularJS创建应用的5个框架
Dec 05 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
Aug 16 Javascript
js 概率计算(简单版)
Sep 12 Javascript
React组件refs的使用详解
Feb 09 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
Aug 31 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
Dec 10 Javascript
react native 原生模块桥接的简单说明小结
Feb 26 Javascript
JavaScript 防盗链的原理以及破解方法
Dec 29 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
php Smarty 字符比较代码
2011/02/27 PHP
ThinkPHP控制器详解
2015/07/27 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
php注册登录系统简化版
2020/12/28 PHP
session 加入redis的实现代码
2016/07/15 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
后勤采购员岗位职责
2013/12/19 职场文书
小学教师节活动方案
2014/01/31 职场文书
个人作风剖析材料
2014/02/02 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
社会实践评语
2014/04/28 职场文书
公积金贷款承诺书
2015/04/30 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang