angularjs - 如何注入生成的javascript

时间:2014-04-08 00:46:07

标签: angularjs

我有一个角度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标记,并显示其余标记。请建议我如何继续?

2 个答案:

答案 0 :(得分:1)

Angular.js有一项名为$sceStrict 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>