Angular.js中下拉框实现渲染html的方法


Posted in Javascript onJune 18, 2017

前言

大家都知道angualrjs处于安全的考虑,插值 指令会对相应字符串进行过滤,避免出现html攻击。但是在一些时候,我们需要渲染html,比如实现一个分级的下拉框

代码如下:

<body ng-app="app" ng-controller="controller">
<select ng-model="value" ng-options="t.text for t in testList"></select>
<script src="/bootstrap/bootstrap/dist/angular-bootstrap/angular.js"></script>
<script type="text/javascript">
 var app= angular.module("app",[]);
 app.controller("controller",["$scope",function ($scope) {
  var testList=[{id:0,text:"  全国"},{id:1,text:" 北京"},{id:20,text:"   上海"},{id:3,text:"  福建"},{id:4,text:"  山东"}];
  $scope.value=20;
  $scope.testList=testList;
 }]);
</script>
</body>

可以看到,空格直接被渲染为  。一个简单粗暴的解决办法是修改angularjs源代码,不再对html进行过滤,在angularjs源码中搜索updateOptions函数,直接对相应脚本进行替换,如下图:

Angular.js中下拉框实现渲染html的方法                 

可以看到,空格已经被正确的渲染,这种方式虽然简单,但是修改将会影响到所有的下拉框控件,有可能会受到html攻击,一种比较中规中矩的办法是采用ng-bind-html来渲染html,这个时候下拉框绑定数据的方式也需要改变,相应代码如下:

<body ng-app="app" ng-controller="controller">
<select ng-module="value" >
 <option ng-repeat="data in testList" value="{{data.id}}" ng-selected="data.id==value" ng-bind-html="data.text">
 </option>
</select>
<script src="/bootstrap/bootstrap/dist/angular-bootstrap/angular.js"></script>
<script type="text/javascript">
 var app= angular.module("app",[]);
 app.controller("controller",["$scope","$sce",function ($scope,$sce) {
  var testList=[{id:0,text:"  全国"},{id:1,text:" 北京"},{id:20,text:"   上海"},{id:3,text:"  福建"},{id:4,text:"  山东"}];
  for(var i=0;i<testList.length;i++)
  {
   testList[i].text=$sce.trustAsHtml( testList[i].text);
  }
  $scope.value='20';//注意,此处必须为字符串类型,否则无法获取选中的值
  $scope.testList=testList;
 
 }]);

</script>
</body>

这种方式非常消耗性能,对于数据量不大的下拉框,这种方式完全可以满足需要,但是如果数据量稍微大些,浏览器就会出现明显的卡顿现象,这个时候可以自己写一个指令来实现下拉框,代码如下:

<body ng-app="app" ng-controller="controller">
<drop-down-list d-list="testList" value="id" text="text" d-select-value="value" ></drop-down-list>
{{value}}
<script src="/bootstrap/bootstrap/dist/angular-bootstrap/angular.js"></script>
<script type="text/javascript">
 var app= angular.module("app",[]);
 app.controller("controller",["$scope","$window",function ($scope,$window) {
  var testList=[{id:0,text:"  全国"},{id:1,text:" 北京"},{id:20,text:"   上海"},{id:3,text:"  福建"},{id:4,text:"  山东"}];
  $scope.value=20;
  $scope.testList=testList;
 }]);
 app.directive("dropDownList",function () {
  return{
   restrict:'E',
   scope :{
    dList:'=',
    dSelectValue:'='
   } ,
   link:function(scope, element, attrs) {
    var d=document;
    var value=attrs["value"];//对应option的value
    var text=attrs["text"];
    var selectValue=scope.dSelectValue;
    element.on("change",function(){
     var selectedIndex=this.selectedIndex;
     scope.$apply(function(){
      scope.dSelectValue=selectedIndex;
     });
    })

    for(var i=0;i<scope.dList.length;i++)
    {
     var option=d.createElement("option");
     option.value=scope.dList[i][value];
     option.innerHTML=scope.dList[i][text];
     if(selectValue==option.value)
     {
      option.setAttribute("selected",true);
     }
     element.append(option);
    }
   },
   template:'<select></select>',
   replace:true

  };
 });

</script>
</body>

这种方式可以比较完美的实现相应功能,是一种较好的选择。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
超级兔子让浮动层消失的前因后果
Mar 09 Javascript
基于jquery的时间段实现代码
Aug 02 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
Aug 29 Javascript
值得分享的bootstrap table实例
Sep 22 Javascript
JS中常用的正则表达式
Sep 29 Javascript
vue v-model实现自定义样式多选与单选功能
Jul 05 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
Apr 29 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 Javascript
vue实现将一个数组内的相同数据进行合并
Nov 07 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
Oct 24 Javascript
antd 表格列宽自适应方法以及错误处理操作
Oct 27 Javascript
vue如何在data中引入图片的正确路径
Jun 05 Vue.js
Webpack打包css后z-index被重新计算的解决方法
Jun 18 #Javascript
利用JavaScript对中文(汉字)进行排序实例详解
Jun 18 #Javascript
JavaScript ES6中const、let与var的对比详解
Jun 18 #Javascript
jquery DataTable实现前后台动态分页
Jun 17 #jQuery
jQuery Jsonp跨域模拟搜索引擎
Jun 17 #jQuery
vue router路由嵌套不显示问题的解决方法
Jun 17 #Javascript
详解vue+vueRouter+webpack的简单实例
Jun 17 #Javascript
You might like
php实现读取内存顺序号
2015/03/29 PHP
php限制ip地址范围的方法
2015/03/31 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
laravel学习教程之关联模型
2016/07/30 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
document.getElementById介绍
2011/09/13 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
python中list列表的高级函数
2016/05/17 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
Django之PopUp的具体实现方法
2019/08/31 Python
pymysql模块的操作实例
2019/12/17 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
一文读懂Python 枚举
2020/08/25 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
教师职位说明书
2014/07/29 职场文书
民事上诉状范文
2015/05/22 职场文书
地道战观后感300字
2015/06/04 职场文书
在校证明模板
2015/06/17 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
60句有关成长的名言
2019/09/04 职场文书
python实现的web监控系统
2021/04/27 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
MySQL Server 层四个日志
2022/03/31 MySQL