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 获取和设置select下拉框的值实现代码
Nov 08 Javascript
js输出阴历、阳历、年份、月份、周示例代码
Jan 29 Javascript
node.js中的fs.readlinkSync方法使用说明
Dec 17 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
Jan 28 Javascript
jquery插件autocomplete用法示例
Jul 01 Javascript
Angular.js中定时器循环的3种方法总结
Apr 27 Javascript
解决vue-router进行build无法正常显示路由页面的问题
Mar 06 Javascript
在HTML文档中嵌入JavaScript的四种方法
May 07 Javascript
JS实现获取word文档内容并输出显示到html页面示例
Jun 23 Javascript
vue跳转方式(打开新页面)及传参操作示例
Jan 26 Javascript
JS实现简易计算器
Feb 14 Javascript
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
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 error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
纯js+css实现在线时钟
2020/08/18 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python使用Supervisor来管理进程的方法
2015/05/28 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
python实现LRU热点缓存及原理
2019/10/29 Python
pytorch forward两个参数实例
2020/01/17 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Django Form常用功能及代码示例
2020/10/13 Python
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
英文请假条
2014/04/11 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
农业项目投资意向书
2015/05/09 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript