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 相关文章推荐
javascript web对话框与弹出窗口
Feb 22 Javascript
下载文件个别浏览器文件名乱码解决办法
Mar 19 Javascript
JSONP跨域的原理解析及其实现介绍
Mar 22 Javascript
javascript作用域和闭包使用详解
Apr 25 Javascript
JavaScript中的变量作用域介绍
Dec 31 Javascript
ligerUI---ListBox(列表框可移动的实例)
Nov 28 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 Javascript
微信小程序云开发如何使用npm安装依赖
May 18 Javascript
React精髓!一篇全概括小结(急速)
May 23 Javascript
javascript实现简易的计算器
Jan 17 Javascript
JavaScript前后端JSON使用方法教程
Nov 23 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网站提速三大“软”招
2006/10/09 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
namespace.js Javascript的命名空间库
2011/10/11 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
jquery表单验证需要做些什么
2015/11/17 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
用Python编写简单的微博爬虫
2016/03/04 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
详解Django的CSRF认证实现
2018/10/09 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
详解python运行三种方式
2019/05/13 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
网上书店创业计划书
2014/01/12 职场文书
社区母亲节活动记录
2014/03/06 职场文书
厨房管理计划书
2014/04/27 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
升学宴学生答谢词
2015/01/05 职场文书
消防验收申请报告
2015/05/15 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书