Meg*_*Hit 85 html javascript sanitization angularjs
我正在尝试将换行符(\n)转换为html br.
根据谷歌集团的讨论,这是我得到的:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
});
Run Code Online (Sandbox Code Playgroud)
那里的讨论还建议在视图中使用以下内容:
{{ dataFromModel | newline | html }}
Run Code Online (Sandbox Code Playgroud)
这似乎是使用旧的html过滤器,而现在我们应该使用该ng-bind-html属性.
无论如何,这会产生一个问题:我不希望原始字符串(dataFromModel)中的任何HTML 呈现为HTML; 只有br的.
例如,给定以下字符串:
虽然7> 5
我仍然不想在这里使用html和东西......
我希望它输出:
While 7 > 5<br>I still don't want html & stuff in here...
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
Dev*_*ski 276
也许你只能用html实现这一点,一种<preformated text>方式?它将避免使用过滤器或进行任何处理.
您所要做的就是在具有此CSS的元素中显示文本:
<p style="white-space: pre;">{{ MyMultiLineText}}</p>
Run Code Online (Sandbox Code Playgroud)
这将解析并显示\n作为新行.对我来说很棒.
这里是一个jsFiddle示例.
Meg*_*Hit 33
我决定只使用2个过滤器,而不是搞乱新的指令:
App.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
})
.filter('noHTML', function () {
return function(text) {
return text
.replace(/&/g, '&')
.replace(/>/g, '>')
.replace(/</g, '<');
}
});
Run Code Online (Sandbox Code Playgroud)
然后,在我看来,我将一个管道输入另一个:
<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>
Run Code Online (Sandbox Code Playgroud)
JJW*_*432 26
一种更简单的方法是制作一个过滤器,将每个文本\n分成一个列表,然后使用`ng-repeat.
过滤器:
App.filter('newlines', function() {
return function(text) {
return text.split(/\n/g);
};
});
Run Code Online (Sandbox Code Playgroud)
并在HTML中:
<span ng-repeat="line in (text | newlines) track by $index">
<p> {{line}}</p>
<br>
</span>
Run Code Online (Sandbox Code Playgroud)
如果您不想使用无限字符串销毁布局,请使用pre-line:
<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
Run Code Online (Sandbox Code Playgroud)
我不知道Angular是否有剥离html的服务,但似乎你需要在传递newlines自定义过滤器之前删除html .我这样做的方法是通过一个自定义no-html指令,它将传递一个范围属性和一个过滤器的名称,以便在删除后应用html
<div no-html="data" post-filter="newlines"></div>
Run Code Online (Sandbox Code Playgroud)
这是实施
app.directive('noHtml', function($filter){
return function(scope, element, attrs){
var html = scope[attrs.noHtml];
var text = angular.element("<div>").html(html).text();
// post filter
var filter = attrs.postFilter;
var result = $filter(filter)(text);
// apending html
element.html(result);
};
});
Run Code Online (Sandbox Code Playgroud)
重要的是text变量.在这里,我创建一个中间DOM元素,并使用该html方法将其附加到HTML ,然后仅使用该方法检索文本text.这两种方法都是由Angular的简洁版jQuery提供的.
以下部分是应用newline过滤器,使用该$filter服务完成.
在这里查看plunker:http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p = preview
| 归档时间: |
|
| 查看次数: |
74343 次 |
| 最近记录: |