Angular.js中下拉框实现渲染html的方法
程序员文章站
2022-06-24 16:59:17
前言
大家都知道angualrjs处于安全的考虑,插值 指令会对相应字符串进行过滤,避免出现html攻击。但是在一些时候,我们需要渲染html,比如实现一个分级的下拉框...
前言
大家都知道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
函数,直接对相应脚本进行替换,如下图:
可以看到,空格已经被正确的渲染,这种方式虽然简单,但是修改将会影响到所有的下拉框控件,有可能会受到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>
这种方式可以比较完美的实现相应功能,是一种较好的选择。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读
-
HTML5中使用postMessage实现Ajax跨域请求的方法
-
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
-
解析在Android中为TextView增加自定义HTML标签的实现方法
-
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
-
JavaScript实现向select下拉框中添加和删除元素的方法
-
用HTML5实现网站在windows8中贴靠的方法
-
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
-
PHP实现将HTML5中Canvas图像保存到服务器的方法
-
【译】在React中实现条件渲染的7种方法
-
JavaScript实现获取select下拉框中第一个值的方法