我有一个角度js页面,其中我从后端动态生成javascript。内容如下
<script type='text/javascript' language='JavaScript' src='https://secure.echosign.com/public/widget?f=XXX'></script>
我的HTML
<div ng-bind-html="htmlString"></div>
我的控制器
$scope.init = function () {
$scope.initForm({
action: $attrs.action
}, function (data) {
$scope.htmlString = "<html><h3>so Here it is</h3>" + $scope.model.htmlScript + "</html>";
});
};
但是,在呈现页面时,会过滤掉javascript标记,并显示其余标记。请建议我如何继续?
答案 0 :(得分:1)
Angular.js有一项名为$sce
(Strict Contextual Escaping)的服务,该服务会自动在$sanitize
等指令上使用ng-bind-html
。如果您希望覆盖转义,则需要挂钩$sce
服务并明确信任您的字符串。
注意强>
这通常不是处理来自不受信任来源的任意HTML的推荐方法,因为它可以打开您的网站以利用漏洞。
$scope.htmlString = $sce.trustAsHtml(
"<html><h3>so Here it is</h3>" + $scope.model.htmlScript + "</html>");
答案 1 :(得分:0)
无论如何你可以在启动时为脚本标签注入JS吗?我做了一些类似的事情,我创建了一个调用django视图的URL,并且视图以javascript的形式返回。在html中它看起来像这样:
<script src="app/generated.js"></script>
我只是从服务器返回一段有效的javascript。由于它作为脚本标记出现,浏览器不知道它是否已生成。这就是我处理用户特定定制的方式。
在我的django应用程序中,我将响应作为内容类型'application / javascript'
返回鉴于此类示例,您可以稍后在页面中插入<script>
标记。
细节:(由于我不知道您使用的平台,我会在django中进行,我觉得它非常易读。)
在Django中,你有像这样映射到url的函数:
<强> urls.py 强>
url(r'^generated.js$', generate_javascript, name="generate-custom-js")
如果从服务器请求该URL,则此行将导致函数generate_javascript运行。在该函数中,我对用户进行身份验证,并从数据库中查找一些内容。然后我通过模板为这个客户渲染javascript。
<强> views.py 强>
@login_required
def generate_javascript(request):
previous_scores = Scores.objects.get(user=request.user).order_by('-date_recorded')[0:10]
return render(request, 'generate.tpl.js', locals(), content_type='application/javascript')
然后你完成这样的模板:
<强> generate.tpl.js 强>
var scores = [
{% for score in scores %}
{{ score.number }}{% if not forloop.last %},{%endif %}
{% endfor %}
];
渲染时,此模板会生成一个类似于“
”的“文件”var scores = [
1,
2,
3,
4,
5
];
这不是你写过的最漂亮的javascript,但它会解析,浏览器不关心它的样子。
然后在 index.html 中有一行
<script src="generated.js"></script>