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 相关文章推荐
JS 文字符串转换unicode编码函数
May 30 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
Jul 17 Javascript
jQuery Animation实现CSS3动画示例介绍
Aug 14 Javascript
javascript中的五种基本数据类型
Aug 26 Javascript
JS实现仿百度文库评分功能
Jan 12 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
Dec 13 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
详解package.json版本号规则
Aug 01 Javascript
JS表格的动态操作完整示例
Jan 13 Javascript
Vue路由 重定向和别名的区别说明
Sep 09 Javascript
node使用async_hooks模块进行请求追踪
Jan 28 Javascript
JS数组的常用方法整理
Mar 31 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
Apache2 httpd.conf 中文版
2006/11/17 PHP
php实现天干地支计算器示例
2014/03/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
Python删除空文件和空文件夹的方法
2015/07/14 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
使用django实现一个代码发布系统
2019/07/18 Python
Python扫描端口的实现
2021/01/25 Python
韩国商务邀请函
2014/01/14 职场文书
初中数学教学反思
2014/01/16 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
个人作风建设总结
2014/10/23 职场文书
学生逃课检讨书
2015/02/17 职场文书
房租涨价通知
2015/04/23 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS