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实现的图片马赛克后显示并切换加文字功能
Apr 21 Javascript
js解决弹窗问题实现班级跳转DIV示例
Jan 06 Javascript
node.js中的fs.appendFileSync方法使用说明
Dec 17 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
Feb 27 Javascript
js如何打印object对象
Oct 16 Javascript
JS实现图片的不间断连续滚动的简单实例
Jun 03 Javascript
AngularJS压缩JS技巧分析
Nov 08 Javascript
Angular2 父子组件数据通信实例
Jun 22 Javascript
详解Javascript中new()到底做了些什么?
Mar 29 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
Jul 25 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
May 13 Javascript
Vue 实现简易多行滚动&quot;弹幕&quot;效果
Jan 02 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时间戳使用实例代码
2008/06/07 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
php json转换相关知识(小结)
2018/12/21 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
前端性能优化建议
2020/09/17 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
Python NumPy库安装使用笔记
2015/05/18 Python
如何在Python中编写并发程序
2016/02/27 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
Django的信号机制详解
2017/05/05 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
python实现ftp文件传输功能
2020/03/20 Python
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
离婚协议书格式
2015/01/26 职场文书
英文投诉信格式
2015/07/03 职场文书
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技