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 密码强度判断代码
Sep 05 Javascript
Javascript 面向对象之重载
May 04 Javascript
IE中createElement需要注意的一个问题
Jul 13 Javascript
Javascript表格翻页效果的具体实现
Oct 05 Javascript
JS对象转换为Jquery对象示例
Jan 26 Javascript
javascript检测浏览器的缩放状态实现代码
Sep 28 Javascript
概述jQuery中的ajax方法
Dec 16 Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
ES6中字符串string常用的新增方法小结
Nov 07 Javascript
基于vue.js实现分页查询功能
Dec 29 Javascript
Vue单文件组件开发实现过程详解
Jul 30 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实现选择排序的解决方法
2013/05/04 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
解读ES6中class关键字
2017/11/20 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
Flask框架 CSRF 保护实现方法详解
2019/10/30 Python
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
体育教师自我鉴定
2014/02/12 职场文书
《老山界》教学反思
2014/04/08 职场文书
单位更名证明
2015/06/18 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技