获取HTML的Ajax请求不执行脚本

时间:2013-05-08 18:09:47

标签: javascript jquery

我在这里多次看到这个问题有很多不同的答案。当我从JQuery 1.5.1迁移到1.9.1时,此代码停止工作。

$.ajax(
    {
        type: 'GET',
        url: MapPath($(this).attr('path')),
        cache: false,
        data: '{}',
        dataType: 'html',
        success: function (result) {
            result = $.parseHTML(result);

            $('#dialog').html(result);
            $('#dialog').dialog('open');
            }
        }
    });

结果包含指向带有src属性的javascript文件的链接。在我添加到#dialog容器之后升级加载并执行的脚本之前。现在它没有。从一个建议开始,我在parseHTML()方法之后尝试了这个:

$.getScript("/myscript.js");

完美无缺,但这不是我想要的。装载容器不应该知道有关装载容器的任何信息。如果加载的容器需要一个脚本包含,则该脚本需要在加载容器时运行。

我已经尝试过找到脚本元素然后eval()的建议。但是一旦我解析HTML(),脚本就不再存在了。为什么我必须使用parseHTML(),请参阅我的其他question

也许这些事情是相关的。

2 个答案:

答案 0 :(得分:1)

开始使用html加载脚本是不安全的,因为浏览器将处理它(它可能在html准备好被操作之前或之后执行不一致)。而是解析字符串,以便以后加载脚本。

$.ajax({
    type: 'GET',
    url: MapPath($(this).attr('path')),
    cache: false,
    success: function (result) {
        result = result.replace(/<script/ig, '<div class="i-script"')
                       .replace(/<\/script/ig, '</div');
        result = $.parseHTML(result);
        var scripts = $(result).find('.i-script').addBack().filter('.i-script').detach();
        $('#dialog').html(result);
        scripts.each(function(i,script){
            $.getScript($(script).attr('src'));
        });
        $('#dialog').dialog('open');
    }
});

显然,上面的代码只适用于外部脚本,您可以轻松修改它以使用内联。

答案 1 :(得分:0)

为什么不使用load() jQuery功能。此方法还执行正在加载的内容中的任何Javascript。

$(container).load(src, function(response, status, xhr) {
  if (status == "error") {
    alert(xhr.status + " | " + xhr.statusText);
  }
});