从ajax响应数据中删除脚本标记

时间:2013-11-17 20:11:17

标签: javascript jquery

我正在使用jQuery处理单页面应用程序。整个html页面作为响应发送为浏览器作为ajax响应。

$.post(url, function (data) {

  $("#resp").html(data);

  $("#resp").find("script").each(function (i) {
                //alert($(this).text());
                eval($(this).text());
  });
});

如何从数据中删除脚本标签,然后将html分配给div?

我面临的问题是在响应页面中编写的脚本。他们最初没有被添加到DOM中,所以我使用了eval(),现在脚本在某些情况下会被添加两次。

2 个答案:

答案 0 :(得分:4)

最简单的方法是将.load()函数与片段选择器一起使用,因为这会在更新内容之前删除<script>标记并导致它们不被执行。如果您正在使用整个HTML页面,但可能没有合适的选择器供您使用。但是,我建议先试试这个:

$('#resp').load(url + ' body');

这样,您就可以获得通过AJAX请求的HTML页面中<body></body>标记之间的内容。

如果这不起作用,我想您可以尝试在添加到DOM之前手动从响应中删除<script>标记:

$.post(url, function(data) {
    var tempDiv = $('<div>').html(data).find('script').remove();
    $('#resp').html(tempDiv.html());
});

这会创建一个不属于文档的新<div>元素,将其HTML设置为来自AJAX请求的返回HTML,搜索其中的<script>元素,然后将其删除。但是,即使该元素还不是当前文档的一部分,脚本仍然可能最终被执行(我从来没有理由这样做,所以我没有测试过它。)

答案 1 :(得分:1)

在安东尼回答的帮助下,这就是我为了让它发挥作用所做的事情:

$.post(url, function (data) {
    var tempDiv = $('<div>').html(data);
    var raw = $('<div>').html(data);
    $(tempDiv).find("script").remove();

    $("#resp").html(tempDiv.html());

    $(scripts).find("script").each(function (i) {
        //alert($(this).text());
        eval($(this).text());
    });
});

我无法理解为什么

var tempDiv = $('<div>').html(data).find('script').remove();

虽然没有工作。