GVKun编程网logo

如何使AngularJS输出转义HTML(angularjs input)

35

在本文中,您将会了解到关于如何使AngularJS输出转义HTML的新资讯,同时我们还将为您解释angularjsinput的相关在本文中,我们将带你探索如何使AngularJS输出转义HTML的奥秘

在本文中,您将会了解到关于如何使AngularJS输出转义HTML的新资讯,同时我们还将为您解释angularjs input的相关在本文中,我们将带你探索如何使AngularJS输出转义HTML的奥秘,分析angularjs input的特点,并给出一些关于Angular.js数据绑定时自动转义html标签及内容、AngularJS HTML编译器介绍_AngularJS、angularjs – Angular JS – 如何处理重复的HTML代码,如页眉/页脚?、angularjs – Angular.js $compile返回html数组但不返回实际的html的实用技巧。

本文目录一览:

如何使AngularJS输出转义HTML(angularjs input)

如何使AngularJS输出转义HTML(angularjs input)

我从服务器获取JSON数据,其中一个字段包含转义的html(实际上是电子邮件正文):

<html>\r\n<head>\r\n<meta http-equiv="Content-Type"content="text/html;charset=iso-8859-1">\r\n</head>\r\n<bodydir="auto">\r\n<div>Buonasera, ho verificato i dati sul mioaccount ed il numero di cell che vi hofornito</div>\r\n<div><br>\r\n<a (更多…)

我为尝试使用AngularJs渲染而疯狂。

以下内容不起作用:

<div ng-bind-html-unsafe="mail.htmlbody"></div>

我认为这是正常的,因为html实际上已经转义了。我应该先取消转义吗?Angular是否可以通过某些可用服务转义html?

如果我这样使用$ sce:

scope.mail.htmlbody = $sce.trustAsHtml(scope.mail.htmlbody);

显示源html,检查元素可以看到引用的内容。换句话说,在页面中将显示源html,而不是呈现html。也许我缺少什么?

答案1

小编典典

同时$sce引入了服务(角度1.2),ng-bind-html-unsafe放弃了对指令的支持。新指令为ng-bind-html。如果使用此代码,则代码应按文档所述工作:

 <div ng-bind-html="mail.htmlbody"></div>

Angular.js数据绑定时自动转义html标签及内容

Angular.js数据绑定时自动转义html标签及内容

angularJS在进行数据绑定时默认是以字符串的形式数据,也就是对你数据中的html标签不进行转义照单全收,这样提高了安全性,防止html标签的注入攻击,但有时候需要,特别是从数据库读取带格式的文本时,无法正常的显示在页面中。

而要对html进行转义,则需要在数据绑定的html标签中使用ng-bind-html属性,该属性依赖与$sanitize,也就是需要引入angular-sanitize.js文件,并在module定义时注入该服务ngSanitize。比如:

html:

<span ng-controller = "myCtr" ng-bind-html = "htmlStr"></span>

javascript:

function myCtr($scope){

  $scope.htmlStr = '<p></p>';

};

这样可以实现html转义,但是有个问题是style这种标签会被angularJS认为是不安全的所以统统自动过滤掉,而为了保留这些就需要开启非安全模式。

如何让自动加载的数据转义html标签呢?实际上还有一种绑定方式:

html:

<div ng-repeat = "article in articles">

  <divhttps://www.jb51.cc/tag/heading/" target="_blank">heading">

    <h4><b>{{article.title}}</b></h4>

  </div>

  <div>

    <article ng-bind-html="article.content | trustHtml">

    </article>

  </div>

</div>

javascript:

success(function(data){

  $scope.articles = data;

});

myApp.filter('trustHtml',function($sce){

  return function(input){

    return $sce.trustAsHtml(input);

  }

});

其中$sce是angularJS自带的安全处理模块,$sce.trustAsHtml(input)方法便是将数据内容以html的形式进行解析并返回。将此过滤器添加到ng-bind-html所绑定的数据中,便实现了在数据加载时对与html标签的自动转义。

AngularJS HTML编译器介绍_AngularJS

AngularJS HTML编译器介绍_AngularJS

概览

AngularJS的HTML编译器能让浏览器识别新的HTML语法。它能让你将行为关联到HTML元素或者属性上,甚至能让你创造具有自定义行为的新元素。AngularJS称这种行为扩展为“指令”

HTML在编写静态页面时,有很多声明式的结构来控制格式。比如你要把某个内容居中,你不必告诉浏览器“去找到窗口的中点位置,然后跟内容的中间结合”。你只需要添加一个 align="center" 的属性给需要内容居中的元素就行了。这就是声明式语言的强大之处。

但是声明式语言也有力所不能及的地方,原因之一在于你不能用它来让浏览器识别新的语法。比如说,你不要内容居中,而是居左到1/3,这时它就做不到了。所以我们需要一个办法让浏览器能学会新的HTML语法。

AngularJS生来自带一些对创建APP非常有用的指令。我们也希望你能自己创造一些对你自己的应用有用的指令。这些扩展的指令就是你创建APP的 “特定领域语言(Domain Specific Language)”。

立即学习“前端免费学习笔记(深入)”;

编译的过程都会在浏览器端发生;服务器端不会参与到其中的任何步骤,也不会做预编译。

编译器(complier)

编译器是AngularJS提供的一项服务,它通过遍历DOM来查找和它相关的属性。整个编译的过程分为两个阶段。

1.编译: 遍历DOM并且收集所有的相关指令,生成一个链接函数。

2.链接: 给指令绑定一个作用域,生成一个动态的视图。作用域模型的任何改变都会反映到视图上,并且视图上的任何用户操作也都会反映到作用域模型。这使得作用域模型成为你的业务逻辑里唯一要关心的东西。

有一些指令,比如ng-repeat会为数据集合里的每一项DOM元素都克隆一次。将整个编译过程分为编译和链接两个阶段的作法改善了整体的性能,因为克隆出来的模板总共只需要被编译一次,然后链接到各自的模型实例上就行了。

指令

指令指示的是“当关联的HTML结构进入编译阶段时应该执行的操作”。指令可以写在元素的名称里,属性里,css类名里,注释里。下面有几个功能相同的使用ng-bind指令的例子。

复制代码 代码如下:





指令本质上只是一个当编译器编译到相关DOM时需要执行的函数。你可以在指令API文档中找到更详尽的关于指令的资料。

下面是一条能让元素变得可拖拽的指令。注意元素里的那个draggable属性。

index.html:

复制代码 代码如下:



 
   
   
 
 
    Drag ME
 

script.js:

复制代码 代码如下:

angular.module(''drag'', []).
directive(''draggable'', function($document) {
    var startX=0, startY=0, x = 0, y = 0;
    return function(scope, element, attr) {
      element.css({
       position: ''relative'',
       border: ''1px solid red'',
       backgroundColor: ''lightgrey'',
       cursor: ''pointer''
      });
      element.bind(''mousedown'', function(event) {
        startX = event.screenX - x;
        startY = event.screenY - y;
        $document.bind(''mousemove'', mousemove);
        $document.bind(''mouseup'', mouseup);
      });

      function mousemove(event) {
        y = event.screenY - startY;
        x = event.screenX - startX;
        element.css({
          top: y + ''px'',
          left:  x + ''px''
        });
      }

      function mouseup() {
        $document.unbind(''mousemove'', mousemove);
        $document.unbind(''mouseup'', mouseup);
      }
    }
 });

通过加入draggable属性可以让任何HTML元素都实现这个新的行为。我们这种改进的优美之处在于我们给了浏览器新能力。我们用了一种只要开发者熟悉HTML规则,就会举得很自然的方式扩展了浏览器理解新行为新语法的能力。

理解视图

网上有很多的模板系统。他们大多数都是“将静态的字符模板和数据绑定,生成新字符,然后通过innerHTML插入到页面元素中”。

这意味着数据上的任何改变,都会导致数据要重新和模板结合生成新字符,再插入到DOM里。这其中会出现的问题有:需要读取用户输入并和模型的数据结合,需要覆写用户的输入,需要手动管理整个更新过程,缺少丰富的表现形式。

AngularJS则不同,AngularJS编译器使用的是带指令的DOM,而不是字符串模板。它返回的是一个链接函数,这个函数和作用域模型结合就会生成一个动态视图。这个视图和模型的绑定过程是“透明的”。开发者不需要做任何关于更新视图的工作。并且应用没有用到innerHTML,所以我们也不用覆写用户的输入。更特别的是,Angular的指令不仅仅能使用字符串形式的绑定,还可以使用一些指示行为的结构体。

AngularJS的编译会生成一个“稳定的DOM”。这意味绑定了数据模型的DOM元素的实例不会在绑定的生命周期中发生改变。这也意味着代码中可以获取到DOM元素的实例引用并注册事件,不用担心这用引用会在模板和数据的结合时丢失。

angularjs – Angular JS – 如何处理重复的HTML代码,如页眉/页脚?

angularjs – Angular JS – 如何处理重复的HTML代码,如页眉/页脚?

我只是读了 introduction to Angular JS,但是我没有看到任何一种方式来编码你的HTML标题代码和页脚代码,只需一次,并将其包含在所有的页面中。

有没有官方/推荐的方式来做到这一点?

正式的方法是使用 ngInclude指令,该指令“抓取,编译并包含外部HTML片段”。
<html ng-app>

<head>
  <script src="http://code.angularjs.org/angular-1.0.1.min.js"></script>
</head>

<body>
  <div ng-include src="'header.url'"></div>
  ...
  <div ng-include src="'footer.url'"></div>
</body>

</html>

有了这个,您可以在所有页面中重复使用相同的header.url和footer.url。

angularjs – Angular.js $compile返回html数组但不返回实际的html

angularjs – Angular.js $compile返回html数组但不返回实际的html

我有以下代码:
app.directive('mySample',function($compile) {
    return {
        //template:"<input type='text' ng=model='sampleData'/> {{sampleData}} <br/>"
        link: function(scope,element,atts,controller) {
            var markup = "<input type='text' ng=model='sampleData'/> {{sampleData}} <br/>";  
            angular.element(element).html($compile(markup)(scope));
            console.log($compile(markup)(scope));
        }
    };
});

而且我希望它能够产生一个输入,一些通过范围和中断耦合的跨度.但是我得到了这个输出:

[[object HTMLInputElement],[object HTMLSpanElement],[object HTMLBRElement]]

我也尝试了模板,在这里单独评论,然后评论链接部分.这会生成输入和中断元素,但不会生成显示耦合模型输入sampleData的跨度.

我在http://jsfiddle.net/KvdM/nwbsT/有一个非工作样本来演示它.

试试这个:
element.html(markup);
$compile(element.contents())(scope);

关于如何使AngularJS输出转义HTMLangularjs input的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Angular.js数据绑定时自动转义html标签及内容、AngularJS HTML编译器介绍_AngularJS、angularjs – Angular JS – 如何处理重复的HTML代码,如页眉/页脚?、angularjs – Angular.js $compile返回html数组但不返回实际的html等相关内容,可以在本站寻找。

本文标签:

上一篇如何在AngularJS上的HTML中直接访问模块的常量(angularjs调用接口)

下一篇从未调用过AngularJS $ http错误函数(调用了未经初始化的对象或者是不存在的对象)