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 相关文章推荐
mapper--图片热点区域高亮组件官方站点
Dec 22 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
Jul 30 Javascript
firefox firebug中文入门教程 脚本之家新年特别版
Jan 02 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
May 24 Javascript
某页码显示的helper 少量调整,另附js版
Sep 12 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
Jan 21 Javascript
Google Dart编程语法和基本类型学习教程
Nov 27 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
Apr 14 Javascript
BootStrap 导航条实例代码
May 18 Javascript
Django与Vue语法的冲突问题完美解决方法
Dec 14 Javascript
微信小程序实现蒙版弹窗效果
Nov 01 Javascript
微信小程序登录数据解密及状态维持实例详解
May 06 Javascript
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的变量总结 新手推荐
2011/04/18 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
php在文件指定行中写入代码的方法
2012/05/23 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
python使用selenium实现批量文件下载
2019/03/11 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
ajax是什么及其工作原理
2012/02/08 面试题
Overload和Override的区别
2012/09/02 面试题
安全事故检讨书
2014/01/18 职场文书
消防安全管理制度
2014/02/01 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
捐赠仪式主持词
2014/03/19 职场文书
六年级学生评语大全
2014/12/26 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android