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 相关文章推荐
jQuery 白痴级入门教程
Nov 11 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
Jan 13 Javascript
javascript 小数取整简单实现方式
May 30 Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
Dec 17 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
Mar 31 Javascript
JavaScript实现图片拖曳效果
Sep 08 Javascript
js实现鼠标拖拽缩放div实例代码
Mar 25 Javascript
vue接入腾讯防水墙代码
May 07 Javascript
微信小程序返回箭头跳转到指定页面实例解析
Oct 08 Javascript
vue data变量相互赋值后被实时同步的解决步骤
Aug 05 Javascript
介绍一下28个JS常用数组方法
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中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
PHP中用hash实现的数组
2011/07/17 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
Yii配置文件用法详解
2014/12/04 PHP
js中小数转换整数的方法
2014/01/26 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
JS获取当前地理位置的方法
2017/10/25 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
vue cli 全面解析
2018/02/28 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
linux 下selenium chrome使用详解
2020/04/02 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
汽车服务工程专业自荐信
2014/09/02 职场文书
搬迁通知
2015/04/20 职场文书
行政上诉状范文
2015/05/23 职场文书
可可西里观后感
2015/06/08 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技