我在这里多次看到这个问题有很多不同的答案。当我从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。
也许这些事情是相关的。
答案 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);
}
});